我想问一下如何使用多个线程来处理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在数组的第一个图像上工作时,第一个线程灰色开始在第二个图像上工作......依此类推....
我该怎么做?
提前感谢您的关注和时间。
答案 0 :(得分:2)
我假设您显示的Windows线程代码并非一成不变。我无法弄清楚你想要用它们做什么。你只有一个互斥体(至少看起来像它),你的所有线程都会在大部分时间被阻塞。
引用Intel TBB run a function in a parallel thread?:
英特尔®线程构建模块旨在提高性能。 大多数通用线程包支持许多不同类型 线程化,例如图形中异步事件的线程化 用户界面。因此,通用包往往是 提供基础的低级工具,而不是解决方案。代替, 英特尔®线程构建模块专注于特定的目标 并行化计算密集型工作,提供更高级别的工作, 更简单的解决方案。
OpenCV在内部使用TBB(如果使用TBB构建它),那么您可以查看源代码以了解事情是如何完成的。从2.4.3开始,OpenCV有一个内置的parallel_for_构造(使用TBB)。您可以在http://answers.opencv.org/question/3730/how-to-use-parallel_for/
找到更多相关信息