使用TBB并行化OpenCV代码

Man*_*ish 2 parallel-processing opencv intel tbb

我试图并行化使用TBB在OpenCV中编写的一些图像匹配代码.问题是,根据我的匹配(在左图像中创建一个5x5窗口并在右边逐个像素地查找匹配)本质上是一个只读操作,目前我正在尝试并行化内部循环(即在给定高度.我指定不同的像素到不同的线程).令我惊讶的是,cvSetImageROI当并行完成时命令会中断.这是代码.

//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);
Run Code Online (Sandbox Code Playgroud)

现在这一切对我来说都是安全的,因为它们只是在读取图像.但是代码崩溃了.如果我在一开始就放锁,虽然它有效.有人可以帮忙吗?

ypn*_*nos 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);
Run Code Online (Sandbox Code Playgroud)

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