C++ 关于visualc++;如何使用线程处理图像数组(并行性)

C++ 关于visualc++;如何使用线程处理图像数组(并行性),c++,multithreading,opencv,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)

我想问一下如何使用多个线程来处理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();
  }
使用互斥对象使其线程安全。这些函数使用cast从void转换为Args…但是,如果我想处理输入数组的所有6个图像,并且我想用于cicle,我如何修改这些函数以接受并使用带有“I”位置的数组?因为我使用for-cicle而不使用线程和works…但是使用线程和for具有并行性,我如何修改这些函数以细化输入数组的每个图像

我的意思是:当第二个线程soglia处理数组的第一个图像时,第一个线程grey start处理第二个图像……等等

我该怎么做


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

我假设您显示的windows线程代码不是一成不变的。我搞不懂你想用它们做什么。因为您只有一个互斥体(至少看起来是这样),所以大多数时候所有线程都会被阻塞

引自:

“英特尔线程构建块”以线程性能为目标。 大多数通用线程包支持多种不同类型的线程 线程的定义,例如图形系统中异步事件的线程 用户界面。因此,通用软件包往往是 低级工具提供了基础,而不是解决方案。相反 英特尔®线程构建块专注于以下特定目标: 并行计算密集型工作,提供更高级别的, 更简单的解决方案


OpenCV在内部使用TBB(如果您使用TBB构建它),因此您可以查看源代码以了解如何完成工作。由于2.4.3,OpenCV有一个内置的并行结构(使用TBB)。你可以在

上找到更多关于它的信息,非常感谢……我试一下。