树莓派3b搭建OpenCV环境
记录一下本人使用树莓派3b弄OpenCV时的过程和遇到的坑,大体参照微雪的教程进行的https://www.waveshare.net/study/article-900-1.html
烧录系统
本人采用的是树莓派官方2020年12月2日发布的2020-12-02-raspios-buster-armhf-full.zip
相关设置
启用摄像头
本人使用的是CSI摄像头,USB摄像头和网络摄像头也都可以,可自行搜索相关使用方法。
进入树莓派配置
sudo raspi-config
选择
Interfacing Options->Camera->Yes
启用摄像头。
设置视频流设备
在OpenCV中,若要读取摄像头数据,需要开启v4l2(video for linux 2),开启后,摄像头设备文件为/dev/video0,OpenCV将从该文件中读取视频流文件。
开启方法如下:
sudo vi /etc/modules
在末尾添加
bcm2835-v4l2
更换软件源和pip源为清华源
不再赘述
重启设备
sudo reboot
安装库和依赖
安装numpy
sudo pip3 install numpy
安装OpenCV所需依赖
sudo apt-get install build-essential git cmake pkg-config -y
sudo apt-get install libjpeg8-dev -y
sudo apt-get install libtiff5-dev -y
sudo apt-get install libjasper-dev -y
sudo apt-get install libpng12-dev -y
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y
sudo apt-get install libgtk2.0-dev -y
sudo apt-get install libatlas-base-dev gfortran -y
下载OpenCV
本次安装时为4.5.0版本,官方地址
需要下载包括OpenCV与OpenCV_Contrib两个仓库
OpenCV仓库:Github地址
OpenCV_Contrib仓库:Github地址
由于国内下载较满,本人采用的是Gitee极速下载
https://gitee.com/mirrors/opencv
https://gitee.com/mirrors/opencv_contrib
git clone https://gitee.com/mirrors/opencv
git clone https://gitee.com/mirrors/opencv_contrib
也可以通过外部下载后转移到树莓派上,这一点不影响,注意文件目录就好。
下载boostdesc_bgm.i等文件
这里就是遇到的一个问题了,编译过程中提示缺少这个文件,错误提示:~/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:673:20: fatal error: boostdesc_bgm.i: No such file or directory
参考的这里
总共缺了以下几个文件,都需要拷贝:
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
放到 opencv_contrib/modules/xfeatures2d/src/ 路径下
修改CMake.txt
这是遇到的第二个坑了,编译过程中出现错误提示
opencv_contrib缺少boostdesc_bgm.i;atal error: features2d/test/test_detectors_regressio
查看发现有这个文件,在 modules 目录下
find -name test_detectors_regression.impl.hpp
网上博主的解决方式简单粗暴,修改 opencv/CMakeLists.txt 文件
在567 行后插入
include_directories("modules")
当然我不是在第567行插入的,我是在他本身的 include(cmake/OpenCVMinDepVersions.cmake) 后面写的
include(cmake/OpenCVMinDepVersions.cmake)
include_directories("modules")
更改树莓派虚拟内存
这是第三个坑了,虚拟内存溢出,报错:fatal error:Killed signal terminated program cc1plus
free -h
查看内存情况 Swap为99M,使用99M
把100M的虚拟内存改为1G,实际上好像需要使用到160M+,设置成200M好像就可以了,保险起见还是设置了1G,反正SD还足够大
sudo vi /etc/dphys-swapfile
找到 CONF_SWAPSIZE=100
将 100 改为 1024
重启树莓派。
配置Cmake
切换目录创建build文件夹
cd /home/pi/opencv-4.5.0/opencv
mkdir build
cd build
配置Cmake,执行以下命令:
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=/home/pi/opencv-4.5.0/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON \
-D WITH_LIBV4L=ON \
-D PYTHON3_EXECUTABLE=/usr/bin/python3.7 \
-D PYTHON_INCLUDE_DIR=/usr/include/python3.7 \
-D PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \
..
注意,以上命令需要根据您具体的软件环境进行修改,否则很可能报错。
- CMAKE_BUILD_TYPE=RELEASE \ 代表编译类型为发行版本
- CMAKE_INSTALL_PREFIX=/usr/local \ 安装路径
- INSTALL_C_EXAMPLES=ON \ C demo
- INSTALL_PYTHON_EXAMPLES=ON \ Python demo
- OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv-4.5.0/opencv_contrib/modules \ OpenCV Contrib路径
- BUILD_EXAMPLES=ON \ 编译demo
- WITH_LIBV4L=ON \ 开启Video for Linux
- PYTHON3_EXECUTABLE=/usr/bin/python3.7 \ Python3路径
- PYTHON_INCLUDE_DIR=/usr/include/python3.7 \ Python3 include文件夹
- PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \ Python3库
- PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \ Python3 Numpy安装路径
- …
编译
一般都是编译过程中遇到错误,并且编译时间很长,大约6到7小时,期间注意树莓派散热就好。
sudo make
安装
sudo make install
等一会安装完成。
测试
使用python3脚本进行测试,参考微雪课堂https://www.waveshare.net/study/article-900-1.html
#!/usr/bin/env python
'''
Waveshare OpenCV Tutorial
00_Test_OpenCV.py
A demo to show whether The OpenCV and CSI camera is well installed
'''
import numpy as np
import cv2
def main():
print("OpenCV Version:{}".format(cv2.__version__))
# 0: use CSI camera,1:use USB camera
cap = cv2.VideoCapture(0)
if(not cap.isOpened()):
print("can't open this camera")
while(True):
ret, FrameImage = cap.read()
if ret == True:
# change to gray image
GrayImage = cv2.cvtColor(FrameImage, cv2.COLOR_BGR2GRAY)
# blur the image
BlurImage = cv2.blur(GrayImage,(7,7))
# use canny to detect contour
CannyImage = cv2.Canny(BlurImage,3,9)
# show the image
cv2.imshow('Camera Capture',CannyImage)
#Press Q to quit
if (cv2.waitKey(1)) == ord('q'):
cap.release()
break
else:
break
if __name__ == '__main__':
print(__doc__)
main()
# Release resource
cv2.destroyAllWindows()
执行后可看到测试图像,至此完成。
更新一下,如果有人和我硬件环境一样,不想再编译了的,我把我编译过的包发上来,下载后解压到home/pi/
目录下,前面配置完成后跳过编译过程,直接进入/home/pi/opencv-4.5.0/opencv/build
sudo make install
安装就好了,我在另一个树莓派上配置后直接安装测试可以。
网盘链接: https://pan.baidu.com/s/1aV8m4kip7NlkUYTJdMVVEA
提取码: mbb1