2011-04-06 46 views
2

我想要使用TBB并行化一些在OpenCV中编写的图像匹配代码。问题在于,根据我的匹配(在左图中创建一个5x5窗口并逐个像素地寻找匹配)本质上是一个只读操作,目前我试图并行化内部循环(即在给定的高度。不同的像素到不同的线程)。让我吃惊的是,虽然并行完成cvSetImageROI命令。这是代码。使用TBB并行化OpenCV代码

//Code below just carves out a window(5x5) at a current width which is to be matched 
cvSetImageROI(leftImageROI, cvRect(curWidth - 2, 0, 5, 5)); 
IplImage* currentROI = cvCreateImage(cvSize(5, 5), leftImageROI->depth, leftImageROI->nChannels); 
cvCopy(leftImageROI, currentROI);     
cvResetImageROI(leftImageROI); 

现在,所有这些看起来像线程安全的,因为他们只是读取图像。但是代码崩溃。如果我在开始时锁定了它,但它仍然有效。有人可以帮忙吗?

回答

7

setImageROI()不是只读操作。显然,它正在改变图像的状态。即使它不会崩溃,您的一些复制操作也会在错误的ROI上运行(由不同的线程设置)。

您的问题的解决方案是使用OpenCV C++ API!

在那里你有一个cv :: Mat而不是IplImage。然后,你可以使用这样的代码:

// given: cv::Mat image 
// returns: cv::Mat dest 
cv::Rect roi(curWidth - 2, 0, 5, 5); 
cv::Mat local(image, roi); 
cv::Mat dest(...); 
local.copyTo(dest); 

现在为什么这是线程安全的?显然,原始图像的状态不会改变。相反,ROI被写入一个新的线程局部矩阵头。

+0

@ ypnos-非常感谢! – Manish 2011-04-07 03:57:19