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混合编程的更多相关文章

  1. matlab + c/c++ opencv 混合编程

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  2. [转] Matlab与C++混合编程,添加OpenCV库

    原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...

  3. Matlab与C++混合编程,添加OpenCV库

    最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...

  4. matlab和C/C++混合编程--调用opencv

    最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...

  5. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  6. [转] Matlab与C++混合编程(依赖OpenCV)

    作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...

  7. matlab 2012 vs2010混合编程

    电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...

  8. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

  9. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

随机推荐

  1. 怎样cp文件夹时忽略指定的文件夹和文件

    在备份ltedecoder程序时,须要把此文件夹拷由到bak文件夹下.但decoder文件夹下有个大文件,不须要备份,还有日志问题,也不须要备份,怎样实现呢?? 方法: cd /source-dir ...

  2. C#无符号右移

    /// <summary>         /// 无符号右移,与JS中的>>>等价         /// </summary>         /// & ...

  3. STL MAP取消排序

    class MyLess{public: bool operator()(const CString str1,const CString str2)const { return TRUE; }}; ...

  4. Envelope

    IEnvelope Interface Provides access to methods and properties of envelopes. Note: the IEnvelope inte ...

  5. 【2006】求N!的精确值

    Time Limit: 3 second Memory Limit: 2 MB 对于阶乘函数,即使自变量较小,其函数值也会相当大.例如: 10!=3628800 25!=155112100433309 ...

  6. 使用Perl批量读取文件最后行

    使用Perl批量读取文件最后行 面对成百上千个文件,有时我们需要查看它的最后行,单个文件打开将耗费大量时间,而通过Perl提取出最后行,将快速的帮助我们处理繁琐的事务. 特性 整个目录完全遍历,自动提 ...

  7. iOS开发之Quartz2D 六 绘制UIImageView

    #import <UIKit/UIKit.h> @interface XMGImageView : UIView /** <#注释#> */ @property (nonato ...

  8. 【Heritrix基础教程之1】在Eclipse中配置Heritrix 分类: H3_NUTCH 2014-06-01 00:00 1262人阅读 评论(0) 收藏

    一.新建项目并将Heritrix源码导入 1.下载heritrix-1.14.4-src.zip和heritrix-1.14.4.zip两个压缩包,并解压,以后分别简称SRC包和ZIP包: 2.在Ec ...

  9. linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定

    背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[root@test vhost]# ps auxUSER  ...

  10. 小雷FansUnion:我有了第一个付费客户(第一个徒弟)

    很高兴地告诉大家一个振奋人心的消息,我刚刚拥有了第一个付费客户. 第一个付费客户是山东青岛的一个上班族,有2年.Net经验,今年转Java开发.对我比较信任,在我的建议下,选择了"拜师学艺& ...