树莓派4B实战:C++与OpenCV环境搭建与首个视觉程序

张开发
2026/4/6 8:14:56 15 分钟阅读

分享文章

树莓派4B实战:C++与OpenCV环境搭建与首个视觉程序
1. 为什么选择树莓派4B做C视觉开发树莓派4B作为一款性价比极高的微型计算机搭载了四核Cortex-A72处理器和最高8GB内存完全能够胜任基础的计算机视觉任务。我去年在一个智能门铃项目中就使用了这个配置实时人脸检测的帧率能达到15fps左右对于嵌入式场景完全够用。相比Python方案C在树莓派上有几个明显优势首先是内存占用更低实测同样的OpenCV人脸检测程序C版本内存占用只有Python的60%其次是执行效率更高在我做的二维码识别测试中C版本比Python快2-3倍。不过要注意的是树莓派的ARM架构处理器在编译OpenCV时会比x86平台慢很多建议放在晚上进行编译。开发环境方面推荐使用官方Raspberry Pi OS原Raspbian的64位版本。32位系统虽然也能用但在处理大尺寸图像时会遇到内存限制。我刚开始用32位系统时就遇到过处理1080p图像崩溃的情况换成64位后问题迎刃而解。2. 开发环境准备2.1 系统基础配置刚装好系统后建议先做这几件事sudo apt update sudo apt full-upgrade -y sudo raspi-config在raspi-config里记得开启摄像头接口Interface Options Camera和增加交换空间Performance Options Swap Size我一般设为2048MB。曾经因为没开摄像头接口调试了半天程序结果发现是硬件没启用这种低级错误希望大家别犯。内存不够的话可以加个散热风扇编译OpenCV时CPU温度经常飙升到80℃。我在亚马逊买的5美元小风扇就能把温度控制在50℃以下连续工作几小时都很稳。2.2 C工具链安装虽然系统自带g但版本可能较旧g --version # 查看当前版本 sudo apt install g-10 -y # 安装较新版本如果要做跨平台开发建议装clangsudo apt install clang-12 lldb-12我习惯用vscode远程开发装好这几个插件体验会好很多C/C微软官方插件CMake ToolsRemote - SSH3. OpenCV完整安装指南3.1 源码下载与依赖安装推荐用opencv_contrib一起编译很多有趣的功能都在这里面git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git依赖包要装全不然后面会报各种奇怪错误sudo apt install -y build-essential cmake git pkg-config libgtk-3-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \ gfortran openexr libatlas-base-dev python3-dev python3-numpy \ libtbb2 libtbb-dev libdc1394-22-dev有个坑要注意libjasper-dev在较新系统中被移除了如果要用JPEG2000格式得手动编译安装。3.2 编译配置技巧在opencv目录下创建build文件夹mkdir build cd build这是我的常用CMake配置兼顾了功能和编译速度cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH../../opencv_contrib/modules \ -D ENABLE_NEONON \ -D ENABLE_VFPV3ON \ -D BUILD_TESTSOFF \ -D OPENCV_ENABLE_NONFREEON \ -D INSTALL_PYTHON_EXAMPLESOFF \ -D BUILD_EXAMPLESOFF \ -D WITH_FFMPEGON \ -D WITH_GSTREAMERON \ -D WITH_OPENMPON \ -D WITH_OPENCLOFF \ -D OPENCV_GENERATE_PKGCONFIGON ..关键参数说明ENABLE_NEON/VFPV3启用ARM芯片的SIMD指令加速BUILD_TESTS/OFF关闭测试可节省30%编译时间WITH_OPENCLOFF树莓派4B的OpenCL支持有问题建议关闭3.3 编译与安装开始编译前建议先调大交换空间sudo nano /etc/dphys-swapfile # 修改CONF_SWAPSIZE2048 sudo /etc/init.d/dphys-swapfile restart然后开始编译建议用screen保持会话make -j4 # 4核全开 sudo make install sudo ldconfig编译过程大概需要3-5小时期间可以去做其他事情。我第一次编译时傻傻地盯着屏幕等了半天后来才知道可以用-j$(nproc)自动检测核心数。4. 环境验证与问题排查4.1 基础验证方法安装完成后先检查版本pkg-config --modversion opencv4如果报错可能是pkgconfig路径问题export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH再写个简单的测试程序#include opencv2/core.hpp #include iostream int main() { std::cout OpenCV version: CV_VERSION std::endl; return 0; }编译运行g test.cpp -o test pkg-config --cflags --libs opencv4 ./test4.2 常见问题解决方案问题1头文件找不到错误信息fatal error: opencv2/opencv.hpp: No such file or directory解决方法sudo cp -r /usr/local/include/opencv4/opencv2 /usr/local/include/问题2链接库错误错误信息undefined reference to cv::imread(...)解决方法检查编译命令是否正确包含pkg-config参数特别注意反引号是键盘左上角的不是单引号。问题3摄像头无法打开错误信息VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported解决方法先确认摄像头在系统层面能工作vcgencmd get_camera # 应返回supported1 detected1 libcamera-hello # 测试摄像头5. 第一个视觉程序实战5.1 实时摄像头显示基础版代码#include opencv2/highgui.hpp #include opencv2/videoio.hpp int main() { cv::VideoCapture cap(0); if(!cap.isOpened()) return -1; cv::Mat frame; while(true) { cap frame; cv::imshow(Live, frame); if(cv::waitKey(1) 27) break; // ESC退出 } return 0; }进阶技巧可以添加FPS显示#include chrono double fps 0; auto last_time std::chrono::system_clock::now(); while(true) { // ... 获取帧 ... auto now std::chrono::system_clock::now(); fps 0.9*fps 0.1*(1000/std::chrono::duration_caststd::chrono::milliseconds(now-last_time).count()); last_time now; cv::putText(frame, FPS: std::to_string((int)fps), cv::Point(10,30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0,255,0), 2); // ... 显示帧 ... }5.2 图像处理示例如果没有摄像头可以用这个绘图程序测试#include opencv2/imgproc.hpp int main() { cv::Mat canvas(480, 640, CV_8UC3, cv::Scalar(240,240,240)); // 画个笑脸 cv::circle(canvas, cv::Point(320,240), 100, cv::Scalar(0,200,200), 2); cv::ellipse(canvas, cv::Point(290,220), cv::Size(10,20), 0,0,360, cv::Scalar(0,0,0), -1); cv::ellipse(canvas, cv::Point(350,220), cv::Size(10,20), 0,0,360, cv::Scalar(0,0,0), -1); cv::ellipse(canvas, cv::Point(320,260), cv::Size(40,20), 0,0,180, cv::Scalar(0,0,0), 2); cv::imshow(Drawing, canvas); cv::waitKey(0); return 0; }5.3 性能优化技巧图像降分辨率树莓派摄像头默认可能输出1080p但对很多应用640x480就够用了cap.set(cv::CAP_PROP_FRAME_WIDTH, 640); cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);使用灰度图像颜色不重要时可以节省75%的处理时间cv::Mat gray; cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);线程优化使用TBB加速cv::setNumThreads(4); // 设置OpenCV使用4个线程6. 项目进阶方向完成基础环境搭建后可以尝试这些有趣的项目人脸检测使用OpenCV自带的Haar级联分类器二维码识别ZBar库OpenCV组合运动检测背景减除算法颜色追踪HSV色彩空间转换我最近用C在树莓派上实现了一个简易的停车位检测系统核心代码不到200行。关键是要善用OpenCV的现成算法避免重复造轮子。比如背景减除可以用MOG2轮廓查找可以用findContours这些OpenCV都实现得非常好。

更多文章