在visual C ++上我如何处理带线程的图像数组(并行性)

时间:2013-05-28 08:31:45

标签: c++ multithreading opencv

我想问一下如何使用多个线程来处理OpenCV Mat图像数组......

简单来说:使用建议给我这个网站的用户,我在一个结构中打包了两个六个图像的数组,以便在线程传递它:

struct Args
{
     Mat in[6];
     Mat out[6];
};

在主代码中,我使用此代码填充输入“in”数组中的六个图像,并将其分配给数组中的struct:

    Mat inn[6],ou[6];

    inn[0]=imread("C:/OPENCV/Test/imgtest/bird1.jpg",1);
inn[1]=imread("C:/OPENCV/Test/imgtest/bird2.jpg",1);
inn[2]=imread("C:/OPENCV/Test/imgtest/bird3.jpg",1);
inn[3]=imread("C:/OPENCV/Test/imgtest/pig1.jpg",1);
inn[4]=imread("C:/OPENCV/Test/imgtest/pig2.jpg",1);
inn[5]=imread("C:/OPENCV/Test/imgtest/pig3.jpg",1);

Args dati;
*dati.in = *inn;
*dati.out = *ou;

现在我想使用多个线程处理这些图像...所有六个图像,并将它们存储在输出数组中以显示它们。

功能是:

 //greyscale funct
 void grey (void *param){
while (TRUE)
{
WaitForSingleObject(mutex,INFINITE);
Args* arg = (Args*)param;
cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
ReleaseMutex(mutex);
}
_endthread();
 }
  //threshold funct
 void soglia(void *param){
while (TRUE)
{
WaitForSingleObject(mutex,INFINITE);
Args* arg = (Args*)param;
threshold(*arg->out,*arg->out,128,255,THRESH_BINARY);
ReleaseMutex(mutex);
}
_endthread();
 }
 //output
void visualizza(void *param){
while (TRUE)
{
WaitForSingleObject(mutex,INFINITE);
Args* arg = (Args*)param;
imshow("Immagine",*arg->out);
waitKey(10);
ReleaseMutex(mutex);
}
//_endthread();
  }

使用互斥对象使其线程安全。这些函数使用强制转换从void转换为Args ...但是,如果我想处理输入数组的所有6个图像,我想用于cicle,我怎样才能修改这些函数来接受并使用“i”数组“位置?因为我使用cicle而不使用线程和工作......但是对于线程并且为了具有并行性,我如何修改这些函数来精心制作输入数组的每个图像?

我的意思是:当第二个线程soglia在数组的第一个图像上工作时,第一个线程灰色开始在第二个图像上工作......依此类推....

我该怎么做?

提前感谢您的关注和时间。

1 个答案:

答案 0 :(得分:2)

我假设您显示的Windows线程代码并非一成不变。我无法弄清楚你想要用它们做什么。你只有一个互斥体(至少看起来像它),你的所有线程都会在大部分时间被阻塞。

引用Intel TBB run a function in a parallel thread?

来自TBB tutorial

  

英特尔®线程构建模块旨在提高性能。   大多数通用线程包支持许多不同类型   线程化,例如图形中异步事件的线程化   用户界面。因此,通用包往往是   提供基础的低级工具,而不是解决方案。代替,   英特尔®线程构建模块专注于特定的目标   并行化计算密集型工作,提供更高级别的工作,   更简单的解决方案。

OpenCV在内部使用TBB(如果使用TBB构建它),那么您可以查看源代码以了解事情是如何完成的。从2.4.3开始,OpenCV有一个内置的parallel_for_构造(使用TBB)。您可以在http://answers.opencv.org/question/3730/how-to-use-parallel_for/

找到更多相关信息