在树莓派4上安装OpenCV4
1. 前言
1.1. 参考资料
- Install OpenCV 4 on your Raspberry Pi:中文网站上关于树莓派上安装OpenCV4的文章大多来自于此,为众多开发者的提供了极大的帮助。
- 编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决:网络的不佳可能会导致缺少部分文件。
1.2. 心理准备
- 整个安装过程总时长约4个小时,绝大多数时间耗费在 cmake 的步骤上。
- 安装途中,可能会遇到各种各样的小问题,然而在互联网上都能够得到解决方法。
- 使用此方法能够在RaspberryPi4顺利安装OpenCV4。
“不麻痹、不厌战、不松劲,咬紧牙关一鼓作气!”
2. 准备
2.1. 树莓派
- 终端,一般而言有如下方式开启终端:
- SSH;
- VNC;
- HDMI + 显示器。
- 联网,应确保树莓派能够连接互联网,一般而言有如下方式联网:
- 网线;
- Wi-Fi。
- 摄像头,安装完毕后,岂不赶紧看看效果?
- CSI摄像头。
2.2. 安装包
当前(2020年6月15日)最新发布包是 4.3.0 版本,激进的开发者当仁不让会选择最新的开发版本。
访问Github下载以下源码包:
- opencv:opencv-4.3.0.tar.gz;
- opencv_contrib:opencv_contrib-4.3.0.tar.gz。
注意:直接下载的opencv与opencv_contril压缩包名称都为"4.3.0.tar.gz”,需注意区分。
3. 系统配置
3.1. 扩展文件系统
在安装opencv之前需要确保安装其依赖包,文件系统的空间可能不足,因此需要扩展文件系统以包含整个SD的空间。
- 键入 df -h 查看空间使用情况,92%已使用表明当前迫切需要扩展文件系统。
$ df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/root 7.0G 6.1G 602M 92% / devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.5M 1.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mmcblk0p1 253M 52M 201M 21% /boot tmpfs 386M 0 386M 0% /run/user/1000
- 键入 sudo rasp-con ,打开配置工具。
- 按动 ↑[\Up] 、 ↓[\Down] 、 Enter 键,依次选择“ 7 Advanced Options Configure advanced settings ”-->“ A1 Expand Filesystem Ensures that all of the SD card storage is available to the ”-->“ Finish ”。
- 回到终端后,键入 sudo reboot 以重启树莓派。
- 重新通过 SSH 连接树莓派后,键入 df -h 命令后,可以看到文件系统容量已扩展至整张SD卡,再无空间不够之虞。
$ df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/root 29G 6.1G 22.1G 23% / devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.5M 1.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mmcblk0p1 253M 52M 202M 21% /boot tmpfs 386M 0 386M 0% /run/user/1000
3.2. 安装依赖包
- 系统更新,键入 sudo apt-get update && sudo apt-get upgrade ,更新软件包列表。
$ sudo apt-get update && sudo apt-get upgrade 命中:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease 命中:2 http://mirrors.tuna.tsinghua.edu.cn/raspberrypi buster InRelease 正在读取软件包列表... 完成 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 正在计算更新... 完成 ...
- 安装常用图像工具包。
sudo apt-get install libjpeg8-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 - 安装GTK。
sudo apt-get install libgtk-3-dev sudo apt-get install libcanberra-gtk*
- 安装OpenCV数值优化函数包。
sudo apt-get install libatlas-base-dev gfortra
- 安装Python 3。
sudo apt-get install python3-dev
- 升级 pip 并安装 numpy 。
$ wget https://bootstrap.pypa.io/get-pip.py $ sudo python3 get-pip.py $ sudo pip3 install numpy Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (1.16.2)
4. opencv安装
4.1. 安装包解压
- 将“opencv-4.3.0.tar.gz”与"opencv_contrib-4.3.0.tar.gz”拷贝至 /home/pi 路径下。
- 解压“opencv-4.3.0.tar.gz”到当前路径,并修改文件夹为 opencv (国际惯例)。
tar zxvf opencv-4.3.0.tar.gz mv opencv-4.3.0 opencv
- 解压“opencv_contrib-4.3.0.tar.gz”到当前路径,并修改文件夹为 opencv_contrib (同上)。
tar zxvf opencv_contrib-4.3.0.tar.gz mv opencv_contrib-4.3.0 opencv_contrib tar zxvf opencv_contrib-4.3.0.tar.gz mv opencv_contrib-4.3.0 opencv_contrib tar zxvf opencv_contrib-4.3.0.tar.gz mv opencv_contrib-4.3.0 opencv_contrib
4.2. cmake
- 进入opencv目录。
cd opencv
- 创建并进入build目录。
mkdir build cd build/
- 执行cmake。
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \ -D BUILD_TESTS=ON \ -D OPENCV_ENABLE_NONFREE=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=ON \ -D BUILD_EXAMPLES=ON ..
Note:
编译选项:
CMAKE_BUILD_TYPE:编译方式;
CMAKE_INSTALL_PREFIX:安装目录;
OPENCV_EXTRA_MODULES_PATH:额外模块的路径;
ENABLE_NEON:启用neon;
ENABLE_VFPV3:启用vfpvfp;
BUILD_TESTS:编译测试例程;
OPENCV_ENABLE_NONFREE:启用nonfree;
INSTALL_PYTHON_EXAMPLES:安装官方Python例程;
INSTALL_C_EXAMPLES:安装官方C例程;
BUILD_EXAMPLES:编译例程。
合理配置`cmake`配置项,加快编译速度。
已知在编译**examples**时会产生编译错误。
-- General configuration for OpenCV 4.3.0 ===================================== -- Version control: unknown -- -- Extra modules: -- Location (extra): /home/pi/opencv_contrib/modules -- Version control (extra): unknown -- -- Platform: -- Timestamp: 2020-06-15T14:28:32Z -- Host: Linux 4.19.75-v7l+ armv7l -- CMake: 3.13.4 -- CMake generator: Unix Makefiles -- CMake build tool: /usr/bin/make -- Configuration: RELEASE -- -- CPU/HW features: -- Baseline: VFPV3 NEON -- requested: DETECT -- required: VFPV3 NEON -- -- C/C++: -- Built as dynamic libs?: YES -- C++ standard: 11 -- C++ Compiler: /usr/bin/c++ (ver 8.3.0) -- C++ flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG -- C++ flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG -- C Compiler: /usr/bin/cc -- C flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -mfpu=neon -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG -- C flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -mfpu=neon -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG -- Linker flags (Release): -Wl,--gc-sections -Wl,--as-needed -- Linker flags (Debug): -Wl,--gc-sections -Wl,--as-needed -- ccache: NO -- Precompiled headers: NO -- Extra dependencies: dl m pthread rt -- 3rdparty dependencies: -- -- OpenCV modules: -- To be built: aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto -- Disabled: world -- Disabled by dependency: - -- Unavailable: alphamat cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv hdf java js matlab ovis sfm viz xfeatures2d -- Applications: tests perf_tests examples apps -- Documentation: NO -- Non-free algorithms: YES -- -- GUI: -- GTK+: YES (ver 3.24.5) -- GThread : YES (ver 2.58.3) -- GtkGlExt: NO -- VTK support: NO -- -- Media I/O: -- ZLib: /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.11) -- JPEG: /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver 62) -- WEBP: build (ver encoder: 0x020f) -- PNG: /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.6.36) -- TIFF: /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 / 4.1.0) -- JPEG 2000: build Jasper (ver 1.900.1) -- OpenEXR: build (ver 2.3.0) -- HDR: YES -- SUNRASTER: YES -- PXM: YES -- PFM: YES -- -- Video I/O: -- DC1394: NO -- FFMPEG: YES -- avcodec: YES (58.35.100) -- avformat: YES (58.20.100) -- avutil: YES (56.22.100) -- swscale: YES (5.3.100) -- avresample: NO -- GStreamer: NO -- v4l/v4l2: YES (linux/videodev2.h) -- -- Parallel framework: pthreads -- -- Trace: YES (with Intel ITT) -- -- Other third-party libraries: -- Lapack: NO -- Eigen: NO -- Custom HAL: YES (carotene (ver 0.0.1)) -- Protobuf: build (3.5.1) -- -- OpenCL: YES (no extra features) -- Include path: /home/pi/opencv/3rdparty/include/opencl/1.2 -- Link libraries: Dynamic load -- -- Python 2: -- Interpreter: /usr/bin/python2.7 (ver 2.7.16) -- Libraries: /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.16) -- numpy: /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.2) -- install path: lib/python2.7/dist-packages/cv2/python-2.7 -- -- Python 3: -- Interpreter: /usr/bin/python3 (ver 3.7.3) -- Libraries: /usr/lib/arm-linux-gnueabihf/libpython3.7m.so (ver 3.7.3) -- numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.16.2) -- install path: lib/python3.7/dist-packages/cv2/python-3.7 -- -- Python (for build): /usr/bin/python2.7 -- -- Java: -- ant: /usr/bin/ant (ver 1.10.5) -- JNI: NO -- Java wrappers: NO -- Java tests: NO -- -- Install to: /usr/local -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /home/pi/opencv/buildcmake
4.3. 增大SWAP空间
- 看到其他开发者编译opencv时由于SWAP过小,导致编译失败。在这儿,增大SWAP空间至2GB。
$ sudo vi /etc/dphys-swapfile # ------------------> # set size to absolute value, leaving empty (default) then uses computed value # you most likely don't want this, unless you have an special disk situation #CONF_SWAPSIZE=100 CONF_SWAPSIZE=2048
Note:
在编译完成后,应当将`CONF_SWAPSIZE`改回100MB。 - 重新启动交换服务。
sudo /etc/init.d/dpshys-swapfile stop sudo /etc/init.d/dphys-swapfile start
4.4. 执行编译(make)
4.4.1. make -j4
编译。在此分配4个核心来进行编译。
$ make -j4 Scanning dependencies of target libprotobuf Scanning dependencies of target libwebp Scanning dependencies of target libjasper Scanning dependencies of target IlmImf [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_cm.c.o [ 0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/alpha_dec.c.o [ 0%] Building CXX object 3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/arena.cc.o [ 0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/buffer_dec.c.o [ 0%] Building CXX object 3rdparty/openexr/CMakeFiles/IlmImf.dir/Half/half.cpp.o [ 0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/frame_dec.c.o [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_debug.c.o [ 0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/src/dec/idec_dec.c.o
4.4.2. 编译报错
4.4.2.1. fatal error: boostdesc_bgm.i
/home/pi/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: 没有那个文件或目录 #include "" ^~~~~~~~~~~~~~~~~
解决方法:
[编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决](https://blog.csdn.net/u011736771/article/details/85960300)
错误:
~/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:673:20: > fatal error: boostdesc_bgm.i: No such file or directory
解决方式:
采用的是源码编译的方式,所以可以查看 build 文件夹下的日志文件 > CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索boostdesc_bgm.i 关键词 (不是在文件夹中搜索),
发现这个文件下载失败了。日志文件里就有它的下载地址,直接复制其下载地址到网> 页可以看该到文件的源码,直接拷贝源码并生存同名文件,放在 opencv_contrib/> modules/xfeatures2d/src/ 路径下即可。
总共缺了以下几个文件,都需要拷贝:
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
参考:
[fatal error: boostdesc_bgm.i: No such file or directory](https://github.com/opencv/opencv_contrib/issues/1301)
ps: 不懂操作的,点开上面这个网址往下拉,有人提供了缺失的各个文件的链接,点> 击保存. 或者直接在这个网页里搜索 BenbenIO 这个用户的回复.
4.4.2.2. opencv error: ‘SURF’ has not been declared
- opencv_contrib没有找到响应的头文件,对比 ~/opencv/modules/features2d/test/ 与 ~/opencv_contrib/modules/xfeatures2d/test/ ,将 opencv_contrib 缺少的“.hpp”文件拷贝一份。
- test_descriptors_invariance.impl.hpp
- test_descriptors_regression.impl.hpp
- test_detectors_invariance.impl.hpp
- test_detectors_regression.impl.hpp
- test_invariance_utils.hpp
- 注意:没有test_precomp.hpp文件。
- 将 ~/opencv/modules/features2d/test/ 中的“test_*.cpp”头文件引用路径修改为当前路径。
// Before Modify // #include "features2d/test/test_detectors_regression.impl.hpp" // #include "features2d/test/test_descriptors_regression.impl.hpp" // Now #include "test_detectors_regression.impl.hpp" #include "test_descriptors_regression.impl.hpp"
参见:[树莓派安装OpenCV-4.1.0及Contrib](https://blog.csdn.net/qq_27971677/article/details/90400118)
4.5. install
sudo make install sudo ldconfig
5. 测试用例
5.1. 查看opencv版本号
键入如下命令,看到版本号为 4.3.0 则表明安装成功。
python
在 python 中输入如下命令。
Python 2.7.16 (default, Oct 10 2019, 22:02:15) [GCC 8.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '4.3.0'
5.2. 打开摄像头
- 使用VNC连接树莓派。
- 依次点击 `编程`-->Thonny Python IDE。
- 输入如下的代码。
import cv2 cap=cv2.VideoCapture(0) #调用摄像头‘0’一般是打开电脑自带摄像头,‘1’是打开外部摄像头(只有一个摄像头的情况) width=960 height=600 cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)#设置图像宽度 cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)#设置图像高度 #显示图像 while True: ret,frame=cap.read()#读取图像(frame就是读取的视频帧,对frame处理就是对整个视频的处理) #print(ret)# #######例如将图像灰度化处理, img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转灰度图 cv2.imshow("img",img) ########图像不处理的情况 frame = cv2.flip( frame, 0 ) frame = cv2.flip( frame, 1 ) cv2.imshow("frame", frame) input=cv2.waitKey(20) if input==ord('q'):#如过输入的是q就break,结束图像显示,鼠标点击视频画面输入字符 break cap.release()#释放摄像头 cv2.destroyAllWindows()#销毁窗口
- 点击"run"按钮,运行程序,则能够看到图像。
<!-- END[在树莓派4上安装OpenCV4] -->