写在前面
- 若不关心 OpenCV 版本,可使用 apt 方式安装,本处不再赘述。
- 执行本篇每一个步骤前,推荐先执行 mkdir 新建文件夹后进入文件夹操作。
下载 OpenCV 源代码
OpenCV 源代码分为两部分,其中可选安装拓展算法 opencv_contrib。
OpenCV: https://github.com/opencv/opencv/releases
OpenCV_Contrib: https://github.com/opencv/opencv_contrib/releases
若直接使用 wget 下载可能会遇到下载速度过慢的问题,可以考虑在电脑上下载完成后使用 U 盘或 Samba 传输到树莓派。
下载完成后将两个文件解压到同一目录备用。此处以文章发布时 OpenCV 最新版本(4.5.2)为例。
$ cd ~ $ mkdir opencv_build && cd opencv_build $ wget https://github.com/opencv/opencv/archive/refs/tags/4.5.2.zip $ wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.2.zip $ unzip opencv-4.5.2.zip $ unzip opencv_contrib-4.5.2.zip $ cd opencv-4.5.2
安装依赖
首先更新软件源并执行清理。
$ sudo apt update && sudo apt upgrade -y $ sudo apt-get dist-upgrade -y --autoremove
然后安装编译所需依赖。
$ sudo apt install -y \ build-essential \ cmake \ git \ pkg-config
$ sudo apt install -y \ gfortran \ libatlas-base-dev \ liblapacke-dev \ liblapack-dev \ libavcodec-dev \ libavformat-dev \ libswscale-dev \ libv4l-dev \ v4l-utils \ libxvidcore-dev \ libx264-dev \ libfontconfig1-dev \ libcairo2-dev \ libgdk-pixbuf2.0-dev \ libpango1.0-dev \ libgtk2.0-dev \ libgtk-3-dev \ libcanberra-gtk3* \ libhdf5-dev \ libhdf5-serial-dev \ libhdf5-103 \ libqtgui4 \ libqtwebkit4 \ libqt4-test \ python3-pyqt5 \ libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ libjpeg-dev \ libtiff-dev \ libpng-dev \ libjasper-dev \ libtbb-dev \ libtbb2 \ python3-dev \ python3-pip \ python3-numpy
最后修复可能出错的安装。
$ sudo apt install -f
调整 swap 分区大小
在下一步的编译 OpenCV 中,由于树莓派的内存和 CPU 限制,cmake 可能会在编译至 100% 处时卡顿很久直到被系统杀死。解决的思路有两种,一种是利用 PC 机交叉编译(事实上 OpenCV 也推荐我们这样做,他们不推荐在任何嵌入式设备上进行编译),或是临时扩展 swap 分区大小。
当设备的物理内存用完时,操作系统将使用交换空间。尽管交换内存比物理内存慢很多,但在某些情况下它仍然很有用。首先打开 /etc/dphys-swapfile 修改交换文件配置。
$ sudo nano /etc/dphys-swapfile
在此文件中,找到 CONF_SWAPSIZE ,修改后面的数值为 2048 。
CONF_SWAPSIZE=2048
接着按下 CTRL+X ,输入 y 并回车,保存并退出。
最后重启交换文件服务。
$ sudo systemctl restart dphys-swapfile
开始编译 & 安装
首先回到第一步解压源码的目录,并进入 OpenCV 源码文件夹。创建并进入新文件夹后开始准备编译。新建 build 文件夹的目的是为了将源码和 cmake 产生的文件区分开来,以便编译错误后能很方便的删除缓存重新编译。
$ mkdir build && cd build
接着执行 cmake 。
- CMAKE_INSTALL_PREFIX 是最终OpenCV的安装位置
- OPENCV_ENABLE_NONFREE 指示是否开启Non-free的算法
- OPENCV_EXTRA_MODULES_PATH 指示扩展算法的源码文件夹
同时注意以下命令的输出,可以从中找到哪些模块没有配置成功。
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.5.2 \ -D OPENCV_EXTRA_MODULES_PATH=/home/dimoj/opencv_build/opencv_contrib-4.5.2/modules \ -D BUILD_EXAMPLES=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D INSTALL_C_EXAMPLES=OFF \ -D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \ -D OPENCV_ENABLE_NONFREE=ON \ -D CMAKE_SHARED_LINKER_FLAGS=-latomic \ -D WITH_FFMPEG=ON \ -D WITH_TBB=ON \ -D BUILD_TBB=ON \ -D WITH_GSTREAMER=ON \ -D WITH_V4L=ON \ -D WITH_LIBV4L=ON \ -D BUILD_NEW_PYTHON_SUPPORT=ON \ -D ENABLE_PRECOMPILED_HEADERS=ON \ -D OPENCV_GENERATE_PKGCONFIG=ON ..
使用 make 开始编译源码,-j 后接的参数代表线程数,树莓派 3B+ 推荐 4 线程。
$ make -j4
待 make 执行完毕后,执行 sudo make install 开始安装。
$ sudo make install
至此,安装完成。
为 IDE 指定动态链接库路径
完成以上安装后,直接使用 cmake 编译源码能够成功运行,但在 IDE (例如 visual studio code )中则会在运行时报错。
error while loading shared libraries: libopencv_core.so.2.4: cannot open shared object file: No such file or directory
这是因为编译器自己找不到安装后的 OpenCV 库的路径,所以需要告诉系统到指定的地方链接。sudo 编辑(或新建) /etc/ld.so.conf.d/opencv.conf 。
$ sudo nano /etc/ld.so.conf.d/opencv.conf
加上动态链接库的位置(即上述 cmake 中参数 CMAKE_INSTALL_PREFIX 指定的路径中的 lib 文件夹)
/usr/local/opencv4.5.2/lib
接着按下 CTRL+X ,输入 y 并回车,保存并退出。
最后检查动态链接库是否生效。
$ sudo ldconfig -v
检查输出中是否有 OpenCV 路径。