opencv - 使用 TBB 并行化 OpenCV 代码

标签 opencv parallel-processing 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);

现在所有这些对我来说看起来都是线程安全的,因为它们只读取图像。但是代码崩溃了。如果我在一开始就加锁,虽然它可以工作。有人可以帮忙吗?

最佳答案

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 被写入一个新的线程本地矩阵 header 。

关于opencv - 使用 TBB 并行化 OpenCV 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5562690/

相关文章:

java - javaCV 中的 BRISK - 如何初始化描述符矩阵?

c++ - OpenCV:将标量转换为不同的颜色空间

algorithm - 如何生成信号以停止分布式模型中其他进程的执行

c++ - 获取显卡型号?

c++ - Linux C++ 中的 Opencv 链接器

opencv - 函数cvFindContours起作用了吗?

parallel-processing - Julia 并行计算 for 循环

mysql - 并行运行处理器时,我应该如何选择下一个要处理的项目?

x86 - 为什么仅在存在存储初始化循环时才对用户模式L1存储未命中事件进行计数?

performance - 为什么使用寄存器 R12 时 POP 很慢?