树莓派3上OpenCV的PThreads/OpenMP/TBB性能对比及独立编译咨询
关于树莓派3上OpenCV并行后端与多版本共存的问题解答
一、OpenMP vs TBB的性能对比
首先得说,树莓派3的4核A53是ARM架构,这俩并行后端在这儿的表现确实有差异,而且和你的具体操作强相关:
- OpenMP:我个人更推荐先试试这个。GCC对ARM的OpenMP支持现在已经很成熟了,它的并行开销很低,像你用到的颜色转换、中值模糊这类粗粒度的并行任务,OpenMP能直接把负载均匀分到4个核心上,效率提升很明显。对于级联跟踪器和中值流跟踪器里的可并行计算部分,OpenMP的集成也更省心,编译时只需要开个
-DWITH_OPENMP=ON的CMake开关就行,不需要额外装复杂依赖。 - TBB:虽然现在TBB也支持ARM,但毕竟是Intel主导开发的,在ARM平台上的优化深度不如x86。而且TBB需要单独安装依赖包,在树莓派上可能会碰到一些小的兼容性问题。你的操作里,中值模糊这类任务TBB的效率和OpenMP差不多,但级联跟踪器这种结构相对复杂的任务,OpenMP的稳定性可能更好一点。
- 总结:如果不想花太多时间折腾,OpenMP是性价比更高的选择;如果有精力做对比测试,也可以试试TBB,但大概率OpenMP在你的场景下表现不会差。
二、不影响现有安装的前提下编译并使用另一个OpenCV版本(Python绑定)
完全可以做到,核心思路就是给新版本指定独立的安装路径,避免和现有版本冲突,具体步骤可以参考:
- 编译前的CMake配置:
- 执行CMake时,通过
CMAKE_INSTALL_PREFIX指定自定义安装目录,比如:cmake -DCMAKE_INSTALL_PREFIX=/home/pi/opencv_custom -DWITH_OPENMP=ON -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF .. - 如果要指定Python绑定的安装路径,可以加上
OPENCV_PYTHON3_INSTALL_PATH参数,比如:
(注意替换成你实际的Python版本对应的路径)-DOPENCV_PYTHON3_INSTALL_PATH=/home/pi/opencv_custom/lib/python3.9/site-packages
- 执行CMake时,通过
- 编译安装:
- 用
make -j4(树莓派3用4线程编译刚好)完成编译,然后make install,这样新的OpenCV就会装到你指定的/home/pi/opencv_custom目录下,完全不会影响原来的/usr/local下的版本。
- 用
- 使用新版本的Python绑定:
- 方法一:临时设置环境变量,在终端里执行:
之后运行Python脚本就会加载新的OpenCV版本。export PYTHONPATH=/home/pi/opencv_custom/lib/python3.9/site-packages:$PYTHONPATH - 方法二:在Python代码里动态添加路径,这样不需要改环境变量:
import sys sys.path.insert(0, '/home/pi/opencv_custom/lib/python3.9/site-packages') import cv2 print(cv2.__version__) # 确认是不是新编译的版本
- 方法一:临时设置环境变量,在终端里执行:
- 额外提示:编译时关掉不需要的模块(比如上面的BUILD_EXAMPLES、BUILD_TESTS),能大幅减少编译时间,也降低依赖出错的概率。
内容的提问来源于stack exchange,提问作者ovg
相关产品推荐
相关产品推荐

