在嵌入式视觉项目中,树莓派因其出色的性价比和丰富的扩展接口成为首选平台。OpenCV 4作为当前最稳定的计算机视觉库版本,相比OpenCV 3在DNN模块、G-API和实时性方面有显著提升。我最近在部署一个智能门禁系统时,就遇到了必须使用OpenCV 4特定API的情况。
树莓派官方系统Raspbian(现称Raspberry Pi OS)默认软件源中的OpenCV版本往往较旧。以最新的Raspberry Pi OS Bullseye为例,通过apt直接安装的OpenCV版本是3.2,这会导致两个实际问题:一是缺少SIFT等专利算法实现,二是无法使用基于ONNX的新型神经网络模型。手动编译安装成为必要选择。
根据我的实测经验,不同型号树莓派的编译时间差异巨大:
建议准备至少16GB的microSD卡,编译过程中临时文件会占用约12GB空间。使用SSD作为启动盘可以显著提升编译速度,在我的测试中能减少约30%的时间。
首先更新系统并安装依赖项:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential cmake unzip pkg-config
关键的图像处理依赖库:
bash复制sudo apt install -y libjpeg-dev libpng-dev libtiff-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
特别提醒:如果跳过libv4l-dev的安装,后续使用摄像头时会遇到v4l2接口报错。
建议同时下载OpenCV和contrib模块,确保功能完整:
bash复制cd ~
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip
unzip opencv.zip && unzip opencv_contrib.zip
经验之谈:指定具体版本号比使用master分支更稳定,我曾在项目中因为使用最新分支代码导致图像处理结果不一致。
创建build目录并配置CMake:
bash复制cd ~/opencv-4.5.5
mkdir build && cd build
关键配置参数:
bash复制cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.5.5/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D WITH_GTK=ON \
-D BUILD_opencv_python3=ON \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D BUILD_EXAMPLES=OFF ..
重要提示:
使用make命令时,建议:
bash复制make -j$(nproc)
监控温度的小技巧:
bash复制watch -n 1 vcgencmd measure_temp
当温度超过70℃时,建议暂停编译:
bash复制sudo apt install -y cpufrequtils
sudo cpufreq-set -g powersave
编译完成后安装:
bash复制sudo make install
sudo ldconfig
创建测试脚本test_opencv.py:
python复制import cv2
print(cv2.__version__)
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('gray.jpg', gray)
运行测试:
bash复制python3 test_opencv.py
/etc/dphys-swapfile中将swap大小临时调整为2GB:code复制CONF_SWAPSIZE=2048
编译完成后记得改回原值并重启
bash复制sudo apt install -y ccache
export PATH="/usr/lib/ccache:$PATH"
bash复制taskset -c 0,1,2,3 make -j4
症状:编译过程中被Killed
解决方法:
bash复制sudo nano /etc/dphys-swapfile
# 修改CONF_SWAPSIZE=2048
sudo /etc/init.d/dphys-swapfile restart
错误信息:ImportError: No module named cv2
解决方法:
bash复制sudo apt install -y python3-opencv
ln -s /usr/local/lib/python3.9/site-packages/cv2 /usr/lib/python3/dist-packages/cv2
错误:VIDEOIO ERROR: V4L2 can't open camera
解决方法:
bash复制sudo usermod -a -G video $USER
sudo reboot
我在智能门禁项目中测试了不同操作的耗时(RPi 4B):
| 操作 | OpenCV 3.2 | OpenCV 4.5.5 | 提升 |
|---|---|---|---|
| 人脸检测(640x480) | 78ms | 65ms | 16.7% |
| 特征匹配(SIFT) | 不支持 | 420ms | - |
| DNN推理(MobileNet) | 不支持 | 320ms | - |
关键发现:新版在传统算法上平均有15-20%的性能提升,更重要的是获得了深度学习相关功能的支持。在部署YOLOv5模型时,OpenCV 4的DNN模块比直接使用PyTorch节省约40%的内存占用。