按照自己的需求在树莓派上灵活使用OpenCV
换源
查看系统版本(我的是bullseye),终端输入:
lsb_release -a
编辑 /etc/apt/sources.list 文件,注释掉其中所有内容,输入(注意版本号):
deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi
编辑 /etc/apt/sources.list.d/raspi.list 文件,注释掉其中所有内容,输入(注意版本号):
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
更新,终端输入:
sudo apt-get update && sudo apt-get upgrade
安装依赖
安装等下要用到的工具,终端输入:
sudo apt-get install build-essential cmake unzip pkg-config
安装一些视频、图像处理库,终端分别输入:
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev
安装GUI后端,终端输入:
sudo apt-get install libgtk-3-dev
安装一个可以减少GTK警告的包,终端输入:
sudo apt-get install libcanberra-gtk*
安装两个数值优化的包,终端输入:
sudo apt-get install libatlas-base-dev gfortran
编译
下载相同版本的opencv和opencv_contrib压缩包,解压到用户目录下,顺手将两个目录重命名为opencv和opencv_contrib
然后终端输入以下命令:
$ cd ~/opencv $ mkdir build $ cd build $ 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=OFF \ -D OPENCV_ENABLE_NONFREE=ON \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D BUILD_EXAMPLES=OFF ..
- 解释各参数含义:
- CMAKE_BUILD_TYPE 这个参数指定了编译的类型。在这里是RELEASE,意味着代码会被优化以获得最佳性能
- CMAKE_INSTALL_PREFIX 这个参数指定了安装目录,即在编译完成后安装的文件将被放置到/usr/local目录下
- OPENCV_EXTRA_MODULES_PATH 这个参数指定了额外的模块路径,用于指定OpenCV额外模块的位置
- ENABLE_NEON 这个参数启用了NEON指令集的优化,NEON是ARM处理器的SIMD指令集,用于加速图像和信号处理操作
- ENABLE_VFPV3 这个参数启用了VFPv3浮点运算优化,VFPv3是ARM处理器的浮点运算单元,用于提高浮点运算性能
- BUILD_TESTS 这个参数禁用了测试的构建,意味着在编译时不会构建测试代码
- OPENCV_ENABLE_NONFREE 这个参数启用了非免费模块,包括SIFT和SURF等专利算法
- INSTALL_PYTHON_EXAMPLES 这个参数禁用了Python示例的安装
- BUILD_EXAMPLES 这个参数禁用了示例的构建,意味着在编译时不会构建示例代码
- 解释各参数含义:
在正式编译前需要扩大交换空间,因为默认只有100MB内存,想使用4个核心编译的话一般需要2GB内存。故编辑 /etc/dphys-swapfile,将 100 改为 2048,保存退出后还需要重启交换空间的服务:
$ sudo /etc/init.d/dphys-swapfile stop $ sudo /etc/init.d/dphys-swapfile start
终端输入
make -j4
开始编译,过程比较久,若遇到编译中断的情况可以只使用make
来编译安装,终端输入:
$ sudo make install $ sudo ldconfig
最后别忘了修改 /etc/dphys-swapfile,将交换空间改回来。因为tf卡读写次数有限,过大的交换空间会加速tf卡的报废
测试
python
- 终端输入
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.9/site-packages
后即可使用(注意自己python的版本)
c++
- 新建demo目录,进入后新建build目录、CMakeLists.txt和main.cpp:
$ mkdir build $ cd build $ mkdir build $ touch CMakeLists.txt $ touch main.cpp
- CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.10) project(demo) add_executable(demo main.cpp) find_package( OpenCV 4 REQUIRED ) include_directories(${OpenCV_INCLUDE_DIRS} "include") target_link_libraries(demo ${OpenCV_LIBS})
- main.cpp内容:
#include <opencv2/opencv.hpp> using namespace cv; int main (int argc, char *argv[]) { Mat img = imread(argv[1], -1); imshow("demo", img); waitKey(0); return 0; }
- 进入build目录,编译:
$ cd build $ cmake .. $ make
- 运行可执行文件demo即可,运行时应传入图片路径,比如:
./demo ~/img.jpg