树莓派交叉编译opencv3.4.1/pycharm安装opencv/实现人脸识别Demo记录

目录

文章目录

  • 目录
  • 前言
  • 树莓派交叉编译opencv3.4.1
    • 安装环境
    • 开始交叉编译
    • 错误记录
  • WIN10+Anaconda+PyCharm安装opencv3.4.7
  • WIN10下opencv人脸检测
  • 树莓派下opencv人脸检测
  • 总结

前言

有需要用到树莓派实现一个人脸识别的程序,所以又回到了交叉编译opencv上。虽然工作的时候用到过opencv,交叉编译一次次失败的恐惧感还在眼前。而这次编译也花了三天的时间,我太难了[哭出声]!网上很多的opencv编译教程,但是写的挺乱的,我尽量把自己遇到的问题表达清楚吧!

树莓派交叉编译opencv3.4.1

交叉编译opencv3.4.1的教程参考Install OpenCV Python on Raspberry Pi 3,原文是英文写的,比较简单,大家可以看原文,也可以看我的翻译。

安装环境

博主使用的是最新版的Raspbian Buster系统,大家可以去官网自行下载安装,安装完成后可以使用单独的显示器操作;也可以使用ssh+vncserver的方式,将树莓派的桌面通过网线投影到电脑上来显示,这里不做描述,大家可以到树莓派实验室上去找教程。
使用的opencv版本是opencv3.4.1,在博主这版的树莓派上,如果使用如下命令直接安装opencv。

sudo apt-get install libopencv-dev
sudo apt-get install python-opencv

但是注意apt-get安装的方式,opencv是在python2.7的环境下存在的,python3下使用import cv2的方式导入opencv会发现找不到cv2模块。由于python2.7即将停止维护,所以以后的程序都会是python3的程序,因此最好在python3的环境下使用opencv编写人脸识别的代码。故有了交叉编译opencv3的需要。

开始交叉编译

  • 第一步:更新Pi
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
  • 第二步:安装依赖
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
  • 第三步:安装python3开发工具
sudo apt-get install python3 python3-setuptools python3-dev
  • 第四步:设置pip工具
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
# 注意:如果wget速度太慢的话,可以直接访问https://bootstrap.pypa.io网页,
# 然后在windows下下载get-pip.py文件,然后使用xftp传到pi上

第五步:抓取OpenCV3.4.1和OpenCV-contrib包

cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.4.1.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
unzip opencv.zip
unzip opencv_contrib.zip
# 建议直接访问https://github.com/Itseez/opencv/archive/3.4.1.zip下载

第六步:安装numpy

sudo pip3 install numpy

第七步:编译OpenCV

cd ~				# ~:指家目录,一般是/home/pi
mkdir opencv
cd opencv	# 将下载好的opencv 
cd ~/opencv-3.4.1/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_C_EXAMPLES=ON \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-3.4.1/modules \
      -D ENABLE_PRECOMPILED_HEADERS=OFF \
      -D BUILD_EXAMPLES=ON ..
  • 第八步:增加swap空间
    将swap大小从100MB增加到1024MB,可以方便OpenCV使用Pi的4个核进行编译
vi /etc/dphys-swapfile

找到 CONF_SWAPSIZE 这个变量,将100改成1024,然后保存退出。使用如下命令重启:

sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

第九步:编译并安装OpenCV

make -j4

编译的过程时间很长,Install OpenCV Python on Raspberry Pi 3这篇教程中说不到两个小时,但是我每次编译都是3小时以上。遇到的错误单独记录,这里把整个编译流程完整的叙述一下。
如果make -j4的结果,命令行中显示了100%,那么恭喜你,opencv编译完成,接下来就是安装的过程了,使用如下命令:

sudo make install
sudo ldconfig
  • 第十步:测试
    在命令行下输入:python3,然后import cv2导入,如果导入成功不会有提示信息。接下来可以用cv2.__version__测试当前opencv的版本。
    树莓派交叉编译opencv3.4.1/pycharm安装opencv/实现人脸识别Demo记录_第1张图片

  • 第十一步:将swap大小从1024改回100
    将swap大小从1024MB改回100MB

vi /etc/dphys-swapfile

找到 CONF_SWAPSIZE 这个变量,将1024改成100,然后保存退出。使用如下命令重启:

sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

错误记录

  • 错误1:
fatal error: boostdesc_bgm.i: 没有那个文件或目录
           #include "boostdesc_bgm.i"

这个错误的产生是因为缺少一下这些文件:

boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i

我把这个资源也上传一下,大家可以去这个链接下载
解决方法
然后将这些文件复制到/home/pi/opencv/opencv_contrib-3.4.1/modules/xfeatures2d/src目录即可继续编译。建议大家直接用xftp的方式将文件复制到该目录下即可。

cp * ~/opencv/opencv_contrib-3.4.1/modules/xfeatures2d/src
  • 错误2:
 /home/pi/opencv/opencv-3.4.1/modules/stitching/include/opencv2/stitching/detail
 /matchers.hpp:52:12: fatal error: opencv2/xfeatures2d/cuda.hpp: 没有那个文件或目录

错误的原因是缺少cuda.hpp文件,这些文件在opencv_contrib-3.4.1/modules/xfeatures2d/include/opencv2目录下,所以直接将这个目录下的文件拷贝到opencv-3.4.1/modules/stitching/include/opencv2/即可
解决方法

cp ~/opencv/opencv_contrib-3.4.1/modules/xfeatures2d/include/opencv2/* ~/opencv/opencv-3.4.1/modules/stitching/include/opencv2/ -rf
  • 错误3:
error: 'CODEC_FLAG_GLOBAL_HEADER' was not declared in this scope

这个错误是我在编译opencv-3.2.0的时候出现的错误,当时编译opencv3.4.1到99%的时候出现了错误4,一直没找到解决方法。想着是不是版本的问题,所以就编译了opencv3.2.0,结果还是出了错误4[此处真的崩溃了,心中有一万只草泥马奔腾而过]。
解决方法:

vim ~/opencv/opencv-3.2.0/modules/videoio/src/cap_ffmpeg_impl.hpp

打开cap_ffmpeg_impl.hpp这个文件,在最顶端加入如下内容即可:

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
  • 错误4:
    这个错误是导致我编译opencv花了3天的罪魁祸首,前几个问题在网上或多或少是有介绍的,但是这个错误我完全没找到答案。可能是没有的原因,也可能是不会用百度的原因,反正没看见那个人解决了。错误如下:
    5
    这个错误我一直没找到原因,后来发现由于编译信息过多,错误信息刷过去了,导致我一直找不到错误原因。最后,找到了错误。
/home/pi/opencv/opencv-3.4.1/modules/python/src2/cv2.cpp:889:34: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]

出错是应为const char不能转换为char。解决这个问题很简单,就是将const char强制类型转换为char,可是因为没找到出错的地方,所以几次编译都死在了错误4上。希望后来人能够看到。

解决方法:

vim ~/opencv/opencv-3.4.1/modules/python/src2/cv2.cpp

定位到889行,修改如下:
树莓派交叉编译opencv3.4.1/pycharm安装opencv/实现人脸识别Demo记录_第2张图片
大家也可以通过查看错误日志的方式来找错误,不过我看了,但是错误4依旧没找到问题所在[这里的教训就是,如果编译出错了,大家要重新编译,这时要盯着屏幕不放,因为错误的信息会用红字标识出来,大家暂停一下,解决红字的错误一般就可以了]。
最后,解决了这些错误,博主就编译成功了。三天,都是泪。

如果大家也被错误4困扰很久的话,帮忙点个赞啊!毕竟我没看到哪位博主有解决这个问题。

WIN10+Anaconda+PyCharm安装opencv3.4.7

博主要在树莓派上实现一个简单人脸识别的Demo,本来是不需要在电脑上安装opencv的,但是由于Demo在树莓派跑有些限制[这部分在后面介绍]。所以必须要在电脑上安装opencv,将电脑上的结果放到树莓派上才行。
WIN10上安装AnAconda+PyCharm的教程可以参考博主的win10安装anaconda3和PyCharm教程。然后需要安装OpenCV,这里博主采用网上经常用的方法:找大神编译好的包,然后安装即可。
下载地址,跳转到这个地址如下图:
树莓派交叉编译opencv3.4.1/pycharm安装opencv/实现人脸识别Demo记录_第3张图片
博主下载的是opencv_python‑3.4.7+contrib‑cp37‑cp37m‑win_amd64.whl这个版本,这个版本的意思是opencv版本位3.4.7,适用于python3.7的编译器。也就是说cp37‑cp37m代表的使用是python的版本。大家对照自己windows的python版本去下载对应的opencv包即可。
如果下的版本和python的版本不对,就会出现平台不适用的情况[不要问我怎么知道的,捂脸]。
然后将opencv_python‑3.4.7+contrib‑cp37‑cp37m‑win_amd64.whl放到D:\Program\anaconda3\Lib\site-packages目录下(注意,D:\Program\anaconda3\Lib\site-packages这个目录是我的anaconda的安装目录,大家可以按照自己的喜好放在在任意目录,只要pip install的时候找得到就可以了)。
接下来,使用WIN+R打开cmd.exe。切换到D盘的Program\anaconda3\Lib\site-packages目录下,使用

pip install “opencv_python‑3.4.7+contrib‑cp37‑cp37m‑win_amd64.whl”

安装opencv3.4.7就可以了。最后,博主在pycharm中直接import cv2没有问题,就没有再往下弄了。其实还有问题就是,在pycharm中没有opencv的库函数的提示,不过我只是完成任务,就不管了。

WIN10下opencv人脸检测

参考用树莓派实现实时的人脸检测。之所以要在Win10下跑这个代码是为了训练分类器,在文章的第六步中要将第五步获取的样本数据训练成.yml文件,这个在Pi上不支持。所以博主就将这个代码放在win10上运行,将训练的模型拷贝到树莓派上去用,结果是成功的。
注意:win10下我没找到haarcascade_frontalface_default.xml的位置,所以从官网直接下了一个,大家下载后将分类器的文件目录设置为这个即可。

树莓派下opencv人脸检测

参考用树莓派实现实时的人脸检测。
注意:opencv的api可以在这里查看
博主还尝试了下用c++编写人脸检测的代码,但是效果不怎么好,也没怎么研究。附上编译命令

g++ test.cpp -o test `pkg-config --cflags --libs opencv`

总结

python是一门高集成度的语言,我们在学习的时候看不到它的底层,这对于程序员是不友好的。但是一旦我们了解了这门语言的原理之后,用的时候就是直接调函数即可。这或许是python流行的一大原因。也就是说python其实是大佬们才能玩的,我们这种渣渣不建议用python直接找工作!

你可能感兴趣的:(opencv,嵌入式)