TBB、OpenCV混合编程
来源:互联网 发布:特效视频软件app 编辑:程序博客网 时间:2024/06/07 04:33
TBB提供了Parallel_for、Parallel_do、Parallel_reduce等通用并行算法,可以应用在不同的并行算法场合,Parallel_for适合用在多个数据或请求之间彼此没有依赖关系,所要进行的操作也是一样的情况。
Parallel_for的调用格式:
Parallel_for(first,last,step,func)
表示一个循环的并行执行,等价于以下操作:
for(auto i =first;i<last; i+=step)func(i);
第三个参数step可以省略,默认为1。Parallel_for的使用:
#include <tbb/tbb.h>#include <iostream>using namespace std;using namespace tbb;void func1(int a){cout << a << endl;}int main(){parallel_for(0, 10, 2, func1); //step为2//parallel_for(0, 10, func1); //默认的step为1getchar();return 0;}
其中一次输出为0 4 2 6 8。
在OpenCV中有些场景需要读入多张图片,并对这些图片进行预处理,如二值化、滤波等这种场景可以使用TBB进行加速。以下是使用parallel_for模板读入多幅图片并执行高斯滤波的示例:
#include <tbb/tbb.h>#include <iostream>#include <core/core.hpp>#include <imgproc.hpp>#include <highgui/highgui.hpp>using namespace std;using namespace tbb;using namespace cv;vector<Mat> imageVec;spin_mutex mutexObj; //互斥锁void ReadImage(int a){//获取图像名字,在硬盘上按0~9.jpg排列stringstream stringstr;stringstr << a;string imagePath;stringstr >> imagePath;imagePath += ".jpg";Mat image = imread(imagePath);mutexObj.lock(); //互斥imageVec.push_back(image);mutexObj.unlock(); //解除互斥}void GaussOperate(int a){GaussianBlur(imageVec[a], imageVec[a], Size(11, 11), 10);}int main(){parallel_for(0, 10, 1, ReadImage); //多线程读入图片parallel_for(0, 10, 1, GaussOperate); //分别执行高斯滤波操作imshow("高斯滤波", imageVec[0]); //显示其中一幅图像waitKey();return 0;}
其中一幅原始输入图像:
滤波效果:
程序中首先定义了一个spin_mutex类的对象mutexObj。TBB中spin_mutex类用来对多线程中一段代码或变量提供同步和互斥保护,保证在同一时间只有一个线程对这段代码或变量进行操作。
lock函数开启互斥锁,unlock函数解除互斥。TBB中提供的互斥锁除了spin_mutex外还有5个: mutex、quening_mutex、spin_rw_mutex、recurisve_mutex、queuing_rw_mutex。
上例中高斯滤波部分只有一个滤波操作,使用lambda表达式更为简洁,上例中的main函数可以改写为:
int main(){parallel_for(0, 10, 1, ReadImage); //多线程读入图片parallel_for(0, 10, 1, [](int a) {GaussianBlur(imageVec[a],imageVec[a], Size(11, 11), 10); }); //lambda表达式写法imshow("高斯滤波", imageVec[0]);waitKey();return 0;}
parallel_for(0, 10, 1, GaussOperate)等价于parallel_for(0, 10, 1, [](int a) {GaussianBlur(imageVec[a],imageVec[a], Size(11, 11), 10); })
- TBB、OpenCV混合编程
- Python & OpenCV混合编程
- Matlab OpenCV混合编程
- OpenCV+ITK混合编程
- opencv中的TBB
- Matlab、C++、OpenCV混合编程
- opencv中使用TBB,IPP
- OpenCV对TBB的支持
- Opencv与matlab的混合编程
- Ubuntu 下matlab与 opencv混合编程
- Matlab、C++混合编程调用OpenCV
- Eigen/OpenCV与boost::gil混合编程
- Python编程->混合编程(C++,python,opencv)实现
- opencv+qt+tbb+vs2010,cmake配置心得
- CUDA8.0+OpenCV2.4.13+VS2015+Win10+TBB混合编译
- Matlab与C/C++混合编程调用OpenCV
- Matlab与C/C++混合编程调用OpenCV
- OpenCV与GDAL混合编程处理遥感图像
- Hello World!
- HTTP与HTTPS的区别
- kubernetes使用cephRBD作为存储卷
- 微信小程序学习之路04-简易的计算器
- mybatis实战教程
- TBB、OpenCV混合编程
- 找出链表的第一个公共结点
- 小七的Javascript 1月12日
- Java的异常体系
- Hrbust 1846 方格涂色【dp+递推思维】好题!好题!好题!
- C语言不定参数实例详解
- 八大排序算法
- springboot + retrofit(平台间接口调用)
- 电脑硬件基础知识以及如何配置一台电脑-显卡篇