TBB、OpenCV混合编程
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为1
getchar();
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混合编程的更多相关文章
- matlab + c/c++ opencv 混合编程
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- [转] Matlab与C++混合编程,添加OpenCV库
原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...
- Matlab与C++混合编程,添加OpenCV库
最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- [转] Matlab与C++混合编程(依赖OpenCV)
作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...
- matlab 2012 vs2010混合编程
电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...
- 算法库:Matlab与C++混合编程
算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
随机推荐
- eclipse 更换国内镜像
大家在用eclipse下载插件,或更新插件的时候,有木有觉得速度贼慢,蜗牛似的速度简直让习惯了4G时代的我们抓狂到底,废话不说,先给大家奉献解决办法 网上找到的国内镜像总结: 1.企业贡献: 搜狐开源 ...
- 【t052】冰岛
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 假设你在一个n*n的冰面上,并且你想到达这个冰面的某处,可是由于冰面太滑了,所以当你向某个方向出发后, ...
- 细说HTML头部标签
原文 简书原文:https://www.jianshu.com/p/4270b1d1037d 大纲 1.头部标签列表 2.头部标签详解 1.头部标签列表 <!DOCTYPE html> & ...
- 神奇校车 = topsage
https://post.smzdm.com/p/6356/ 适合6岁至99岁的小盆友看的<The Magic School Bus> (神奇校车) http://club.topsage ...
- sed学习总结
sed学习总结 sed工作流 测试文件:cat employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysad ...
- css3-8 内外边距中的注意要点有哪些
css3-8 内外边距中的注意要点有哪些 一.总结 一句话总结:padding,border都是外延的.margin会合并. 1.两元素样式都有margin:15px,他们中间的距离是15px还是30 ...
- VMWare提供三种工作模式桥接(bridge)、NAT(网络地址转换)和host-only(主机模式)
1.桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位),它可以访问网内任何一台机器.在桥接模式下,我们往往需要为虚拟主机配置IP地址.子网 ...
- 编辑器sublime、终端运行python
sublime编辑器 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用) Sublime Text是由程序员Jon Skinner于2008年1月份 ...
- 【codeforces 754A】Lesha and array splitting
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- [Postgres] Create a Postgres Table
Learn how to create a table using the most widely-used data types (serial, varchar, integer, float, ...