检查OpenCV是否使用TBB库编译

前言

TBB全称Threading Building Blocks,是Intel针对基于多核处理器进行软件开发而创建的一套C++模板库,核心作用是用来在任务处理中做多线程加速。OpenCV提供了接口来编译和使用TBB。
在这里插入图片描述
关于更多TBB的优势见参考资料[6][7]

OpenCV基于TBB编译

在Cmake配置编译选项中指定-D WITH_TBB=ON,例如 :

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_C_COMPILER=/usr/bin/gcc \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D WITH_TBB=ON \
-D BUILD_opencv_cudacodec=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=1 \
-D WITH_FFMPEG=ON \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_PYTHON3_INSTALL_PATH=/home/ubuntu/conda/envs/pytorch/lib/python3.6/site-packages \
-D WITH_NVCUVID=ON \
-D BUILD_opencv_python3=yes \
-D OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/installs/opencv_contrib/modules \
-D PYTHON2_EXECUTABLE=/home/ubuntu/conda/envs/pytorch/bin/python \
-D PYTHON3_EXECUTABLE=/home/ubuntu/conda/envs/pytorch/bin/python \
-D PYTHON_INCLUDE_DIR=/home/ubuntu/conda/envs/pytorch/include/python3.6m \
-D PYTHON_INCLUDE_DIR2=/home/ubuntu/conda/envs/pytorch/include/python3.6m \
-D PYTHON2_LIBRARY=/home/ubuntu/conda/envs/pytorch/lib/libpython3.6m.so \
-D PYTHON3_LIBRARY=/home/ubuntu/conda/envs/pytorch/lib/libpython3.6m.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/home/ubuntu/conda/envs/pytorch/lib/python3.6/site-packages/numpy/core/include \
-D BUILD_EXAMPLES=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=7.5 ..

更多编译安装OpenCV内容见参考资料[3]

检查TBB编译

ldd /usr/local/lib/libopencv_core.so

如果没有成功基于TBB编译,则打印信息中没有tbb相关内容:

linux-vdso.so.1 (0x00007000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00efec000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x0fbbc5000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x009a8000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00061f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00281000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0ac78000)
/lib64/ld-linux-x86-64.so.2 (0x000076000)

否则应该类似:
在这里插入图片描述

OpenCV基于TBB开发

OpenCV提供了cv::parallel_for_ 方法来更加方便地使用TBB。如果编译的时候没有使用TBB库,那么OpenCV会调用自身实现的parallel_for方法来实现并行加速。

基于TBB的OpenCV编程示例见参考资料[8]

版权说明

本文为原创文章,独家发布在blog.csdn.net/TracelessLe。未经个人允许不得转载。如需帮助请email至tracelessle@163.com
在这里插入图片描述

参考资料

[1] Advanced HPC Threading: Intel® oneAPI Threading Building Blocks
[2] Intel® Threading Building Blocks Tutorial
[3] Ubuntu上安装opencv-cuda加速_TracelessLe的博客-CSDN博客
[4] linux - Check if OpenCV is compiled with TBB - Stack Overflow
[5] linux - 检查OpenCV是否用TBB编译 - IT工具网
[6] Intel Thread Building Blocks (TBB) 入门篇_mob604756f976e6的技术博客_51CTO博客
[7] 交叉编译了TBB库的opencv会得到明显的速度优化吗? - 知乎
[8] Multithreading in OpenCV using TBB

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV可以使用Intel的TBB(Threading Building Blocks)进行多线程加速,从而提高相机标定的速度。以下是使用TBB进行相机标定的基本步骤: 1. 导入OpenCVTBB ```c++ #include <opencv2/opencv.hpp> #include <tbb/tbb.h> ``` 2. 定义并行任务 使用TBB的主要目的是将相机标定中的一些计算密集型任务分配到多个线程中并行计算。在这里,我们可以将每个图像的角点检测和角点坐标的提取作为一个任务。 ```c++ class FindCornersTask { public: FindCornersTask(const cv::Mat& image, std::vector<cv::Point2f>& corners, cv::Size pattern_size, int flags) : image_(image), corners_(corners), pattern_size_(pattern_size), flags_(flags) {} void operator()() const { bool found = cv::findChessboardCorners(image_, pattern_size_, corners_, flags_); if (found) cv::cornerSubPix(image_, corners_, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1)); } private: cv::Mat image_; std::vector<cv::Point2f>& corners_; cv::Size pattern_size_; int flags_; }; ``` 3. 创建并行任务列表 我们可以使用TBB的并行算法`parallel_for`来运行一组任务。下面的代码创建一个任务列表,每个任务都是使用上一步定义的`FindCornersTask`类。 ```c++ std::vector<FindCornersTask> tasks; for (int i = 0; i < image_list.size(); i++) { tasks.push_back(FindCornersTask(image_list[i], corners[i], pattern_size, flags)); } ``` 4. 运行并行任务 我们可以使用`parallel_for`算法来运行一组任务。这将自动将任务分配到可用的线程上并行执行。 ```c++ tbb::parallel_for(tbb::blocked_range<size_t>(0, tasks.size()), [&](const tbb::blocked_range<size_t>& r) { for (size_t i = r.begin(); i != r.end(); ++i) { tasks[i](); } }); ``` 完整的示例代码如下: ```c++ #include <opencv2/opencv.hpp> #include <tbb/tbb.h> class FindCornersTask { public: FindCornersTask(const cv::Mat& image, std::vector<cv::Point2f>& corners, cv::Size pattern_size, int flags) : image_(image), corners_(corners), pattern_size_(pattern_size), flags_(flags) {} void operator()() const { bool found = cv::findChessboardCorners(image_, pattern_size_, corners_, flags_); if (found) cv::cornerSubPix(image_, corners_, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1)); } private: cv::Mat image_; std::vector<cv::Point2f>& corners_; cv::Size pattern_size_; int flags_; }; int main(int argc, char** argv) { std::vector<cv::Mat> image_list; // load images ... int flags = cv::CALIB_CB_ADAPTIVE_THRESH + cv::CALIB_CB_NORMALIZE_IMAGE + cv::CALIB_CB_FAST_CHECK; cv::Size pattern_size(9, 6); std::vector<std::vector<cv::Point2f>> corners(image_list.size()); std::vector<FindCornersTask> tasks; for (int i = 0; i < image_list.size(); i++) { tasks.push_back(FindCornersTask(image_list[i], corners[i], pattern_size, flags)); } tbb::parallel_for(tbb::blocked_range<size_t>(0, tasks.size()), [&](const tbb::blocked_range<size_t>& r) { for (size_t i = r.begin(); i != r.end(); ++i) { tasks[i](); } }); // run camera calibration ... return 0; } ``` 这样,我们就可以使用TBB加速相机标定的过程了。需要注意的是,TBB需要在编译时与OpenCV一起链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracelessLe

❀点个赞加个关注再走吧❀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值