1.OpenCV安装

说到OpenCV的安装,我想做人脸识别,网上找了很多教程,都涉及到OpenCV,而很多教程是基于Adrian Rosebrock的这篇教材Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi

刚刚看到这篇教程的时候,着实被它的流程吓到了,步骤确实很多,以前装P4开发环境的经历告诉我,这个过程一定不会很顺利。

于是我想按照这个教程复现一遍。

(1)安装依赖

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install build-essential cmake pkg-config
$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install python2.7-dev python3-dev

刚开始我是在现有的Raspberry Pi系统上直接安装的,这之前已经配好了网站服务器、FTP服务器等前序博客所做的事情,系统已经不是那么“干净”了。于是我运行上面第三条命令时就报错了,提示要安装的xxx依赖于xxx,但是xxx不会被安装。百度了很多方法,都没有办法解决。差点就想放弃了,第二天决定重新烧录一个干净的系统,并且做好系统备份(很重要!!)

重新烧录的系统果然“干净”,一路顺利,完成依赖的安装。

(2)下载OpenCV源码

$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
$ unzip opencv.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
$ unzip opencv_contrib.zip

对网速要求比较高,所幸学校的网络比较快。但是下载完毕,运行unzip解压时报错:Archive: opencv.zip End-of-central-directory signature not found.  Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive.

按照网上的方法试着用jar解压,可以成功,暂时没有什么问题了。

(3)安装pip

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py

(4)安装Python虚拟机

$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip

配置~/.profile,添加内容:

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

使之生效

source ~/.profile

使用Python3 安装虚拟机

$ mkvirtualenv cv -p python3

虚拟机完成安装之后,后续的所有操作全部在虚拟机中进行。按照教程的说明,一定要看清楚命令行前面是否有(cv),以此作为是否在虚拟机的判断!

以后要重新进入虚拟机,可运行下面的命令

$ source ~/.profile
$ workon cv

再次提醒:后续所有操作均在虚拟机中

安装numpy

$ pip install numpy

(5)编译OpenCV

$ cd ~/opencv-3.3.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
-D BUILD_EXAMPLES=ON ..

按照教程提示,编译前检查Python相关配置,结果发现除了Interpreter,其他信息都没有。。。

我按照教程的建议,再三确认了的确在虚拟环境中,然而无济于事。。。

又想放弃了。

第三天,我突然想也许是OpenCV版本太久了,我到Github上看,最新的版本已经到了4.1.2,而且教程中也说了可以把3.3.0改成最新的版本。那既然其他环节都是最新的,那这个相应的也最新吧。于是我重新下载了4.1.2,这次unzip也十分顺利!

再次运行编译前的检查,这次没有问题了。



编译前,按照教程,增大了交换空间CONF_SWAPSIZE=1024

$ sudo nano /etc/dphys-swapfile  #虚拟机中sudo才可以修改

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
$ make -j4 #开始编译(耗时1个多小时)



安装OpenCV

$ sudo make install
$ sudo ldconfig

之后按照教程,检查OpenCV的安装位置,然而按照教程的命令输入,发现是空的!于是我去核对了一下编译前检查的结果,发现我的Python是3.7而不是教程用的3.5,问题解决!同时,我装好的文件名只有cv,没有后面的so

$ ls -l /usr/local/lib/python3.7/site-packages/

$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
$ ln -s /usr/local/lib/python3.7/site-packages/cv2 cv2



(6)验证安装

$ source ~/.profile
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'4.1.2'
>>>

成功了!记得备份系统!

2.使用OpenCV和Python控制摄像头模块

(1)picamera模块安装

之后继续按照作者的另一个教程Accessing the Raspberry Pi Camera with OpenCV and Python完成摄像头模块picamera安装,摄像头的初始配置之前已经完成,再此不再赘述。

开启虚拟机

$ source ~/.profile
$ workon cv

再次提醒:后续所有操作均在虚拟机中

安装picamera

$ pip install "picamera[array]"

(2)在Python代码中导入OpenCV控制摄像头

按照教程给的示例代码,验证了Python控制摄像头拍照的效果,发现照片完全是黑的,经过分析,调高了示例代码中sleep的时间,让摄像头曝光时间增加,效果明显。

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2 # initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
rawCapture = PiRGBArray(camera) # allow the camera to warmup
time.sleep(3) #此处把0.1改成了3 # grab an image from the camera
camera.capture(rawCapture, format="bgr")
image = rawCapture.array # display the image on screen and wait for a keypress
cv2.imshow("Image", image)
cv2.waitKey(0)

不得不说,这个大神写的教程确实很赞。建议用“干净”的系统安装,可以适当提高OpenCV的版本。编译过程很长,万一失败了,真的很打击积极性,所幸成功了。

3.Raspberry Pi 的人脸识别

  • 到此为止,我们已经完成在Raspberry Pi上安装OpenCV和摄像头模块picamera,并且成功用导入了opencv的python代码控制picamera,实现了拍摄一张照片的demo。在此基础上,还可以做的事很多,比如人脸识别。

  • 人脸识别可以用face_recogniztion这个开源模块。

  • 在前面创建的python虚拟环境cv中安装dlib和face_recognition,使得能够在cv中运行face_recognition。之后如果不进入虚拟环境cv,那么就无法运行face_recognition。

$ pip install dlib
$ pip install face_recognition

  • 运行GitHub上face_recognition仓库下的代码

    该示例是一个简单的程序,仅调用了picamera,未用到opencv模块。将代码保存在py文件中,在虚拟机cv中运行,并保证代码中的预先加载的人脸信息和代码py文件在同一目录。程序先获取特定脸部信息,之后不断读取摄像头当前捕获的人像,显示人像数,并和已有脸部信息进行比对,如果没有匹配就是unknown person,如果匹配,就显示人名。

    运行结果:

  • 同一个代码仓库下的另一个示例

    该示例引入opencv来处理图像信息,可以实时显示当前摄像头识别到的人脸信息

4.使用OpenCV的Docker容器运行运行人脸识别代码

OpenCV安装过于复杂,使用OpenCV容器直接省去了安装步骤。

  • Docker镜像: sixsq/opencv-python,支持ARM
  • 拉取基础镜像后,进入容器,安装picamera[array]、dlib和face_recognition,commit更新容器建立新的镜像
  • 以上述新的镜像为基础,编写Dockerfile,设置启动时执行的命令:ENTRYPOINT["python3"],重新build最终的镜像
  • 启动容器
$ docker run -it -v [本地代码目录]:[容器工作目录] --device=/dev/vchiq --device=/dev/video0 --name [容器名] [镜像名] [人脸识别python代码]
  • 运行结果:

虽然容器省去了费时费力的安装配置,但是也会遇到新的问题:

  • 直接以sixsq/opencv-python做Dockerfile,RUN安装face_recognition报错了,于是选择直接进到容器内安装再更新

  • 运行容器报错fail to open vchiq instance,讨论后发现需要在启动容器时使用参数--device=/dev/vchiq解决,具体见上述命令,让容器使用Raspberry Pi的摄像头

  • 如果希望通过容器运行人脸识别相关的GUI图形化程序,即上面的第二个例子,直接使用之前的方法是会报错VIDEOIO ERROR: V4L: can't open camera by index 0,这可以通过--device=/dev/video0解决,另一个报错关键的报错是: cannot connect to X server



    经过和学生探讨,得到解决方法:参考Docker运行GUI软件的方法,添加/tmp/.X11-unix挂载以及DISPLAY环境变量,并且用xhost命令允许所有用户访问X11服务,之后出错X Error:BadDrawable (individ Pixmap or Window parameter 9),还要添加QT_X11_NO_MITSHM=1环境变量,最终修改容器启动shell脚本如下:

(1)VNC访问Raspberry Pi,在树莓派上直接启动

#sudo apt-get install x11-xserver-utils
xhost +
docker run -it \
-v [本地代码目录]:[容器工作目录] \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
--device=/dev/vchiq \
--device=/dev/video0 \
--name [容器名] \
[镜像名] \
[人脸识别python代码]

(2)ssh访问Raspberry Pi,在pc上远程启动

#sudo apt-get install x11-xserver-utils
xhost +
docker run -it \
-v [本地代码目录]:[容器工作目录] \
--net=host \
-v $HOME/.Xauthority:/root/.Xauthority \
-e DISPLAY=:10.0 \
-e QT_X11_NO_MITSHM=1 \
--device=/dev/vchiq \
--device=/dev/video0 \
--name [容器名] \
[镜像名] \
[人脸识别python代码]

VNC访问Raspberry Pi的运行结果:



SSH访问Raspberry Pi的运行结果:

Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块的更多相关文章

  1. Raspberry Pi 4B基本设置

    目录 一.SSH登录Raspberry Pi 二.开启VNC服务 三.将SD卡分区扩展 四.修改软件源 一.SSH登录Raspberry Pi 完成系统烧录后,就需要登录Raspberry Pi,此时 ...

  2. Raspberry Pi 4B 安装 CentOS 8

    最近新入手一块Raspberry Pi 4B 8G的板子,想在这块板子上搭建CentOS 8的环境.经过数次采坑终于安装成功. 准备条件: 1.Raspberry Pi 4B 板子 +  SD卡 2. ...

  3. raspberry pi 4b 常见的一些配置信息

    实验记录地址 https://gitee.com/dhclly/icepi.raspberry-pi 针脚图 面包板 gnd & vcc VCC:电路的供电电压: GND:指板子里面总的地线. ...

  4. Raspberry Pi 4B FTP服务器配置

    目录 1. 安装vsftpd并启动 2. 编辑配置文件 3. 重启服务 4. 测试 5. 为Web服务器添加管理员账户,便于通过ftp网站信息 参考资料:树莓派(raspberry pi)学习之安装f ...

  5. Raspberry Pi 4B Web服务器配置

    目录 1. 安装nginx 2. 安装PHP 3. 修改nginx配置文件 4. 安装MariaDB数据库 参考资料1:树莓派4B安装PHP7.3 + Nginx + MySQL 教程 参考资料2:[ ...

  6. Raspberry PI 4B 安装和配置 Raspbian

    做记录,以备之后需要,待完成中 目录 做记录,以备之后需要,待完成中 下载镜像和安装程序 ssh 远程访问 下载镜像和安装程序 Raspbian: installer: ssh 远程访问 开启ssh ...

  7. install ubuntu on raspberry pi 4b

    how to install 第一次连 wifi 时总会失败,需要 sudo reboot 重启后,就可以正常连接 当需要切换 wifi 时,修改 network-config 文件是无效的,需要 s ...

  8. Raspberry Pi 4B 安装QT5和qtCreator

    https://blog.csdn.net/coekjin/article/details/52049273 sudo apt-get install qt5-default sudo apt-get ...

  9. Raspberry Pi (树莓派) 更换源 - stretch 版本

    Raspberry Pi 默认更新源访问速度慢,更换国内源速度提升.更换软件更新源 (/etc/apt/sources.list),更换系统更新源 (/etc/apt/sources.d/raspi. ...

随机推荐

  1. Oracle复习

    这阵子忙着面试 ,之前搞项目一直用的 mysql ,然后面试的大公司!(呵呵)偏偏用的是 oracle 没办法恶补 前面学过的但是没怎么用的Oracle 基础知识,打算主要从下面几点入手. 环境搭建: ...

  2. sql 视图的好处

    第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没有任何意义, ...

  3. php文件包含漏洞 file inclusion vulnerability

    0x00 何为文件包含漏洞 开发人员如果在写类似include "a.php"的代码时,如果将a.php写成了可变的值,那么就可以在上面做文章,举个理想的例子: <? inc ...

  4. Error:Unable to start the daemon process. This problem might be caused by incorrect configuration of

    我试了修改或者配置gradle文件没有成功解决的 ,所以试了这个解决方案 试了下这个是可以解决的. 变量名   _JAVA_OPTIONS 变量值   -Djava.net.preferIPv4Sta ...

  5. 栈 · 有getMin功能的栈O(1)

    题面 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中的最小元素的操作. 要求 pop(), push(), getMin()时间复杂度都是O(1) 思路 1.准备两个栈,数据栈+最小元素 ...

  6. flex布局下img图片变形的解决方法

      图片正常效果   图片变形效果 一.flex-shrink: 0 给 img 设置 flex-shrink: 0; flex-shrink 的默认值为1,如果没有显示定义该属性,将会自动按照默认值 ...

  7. 二零一八阿里p7笔试116题

    1. junit用法,before,beforeClass,after, afterClass的执行顺序 2. 分布式锁 3. nginx的请求转发算法,如何配置根据权重转发 4. 用hashmap实 ...

  8. Endless looping of packets in TCP/IP networks (Routing Loops)

    How endless looping of packets in a TCP/IP network might occur? Router is a device used to interconn ...

  9. Python使用selenium模拟点击(一)

    本文适合有点Python基础阅读,(没基础的话,相对的比较蒙蔽,争取能让小白能一步一步跟上来) 2019-03-05 14:53:05 前几天由于需要到一个网站进行签到~~听说Python能够模拟请求 ...

  10. 谷歌网页性能分析工具 Lighthouse 的安装及使用

    github地址:https://github.com/GoogleChrome/lighthouse 一.如果可以翻墙的话可以从 chrome 扩展插件里直接安装. 二.下面是另一种使用方法:基于 ...