Распараллеливание кода OpenCV с использованием TBB - PullRequest
2 голосов
/ 06 апреля 2011

Я пытаюсь распараллелить некоторый код соответствия изображений, написанный в OpenCV, используя TBB.Проблема в том, что, по моему мнению, сопоставление (создание окна 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);

Теперь все это выглядит поточно-безопасным для меня, поскольку они только читают изображения. Однако код вылетает.Если я поставлю замок в самом начале, хотя он работает.Может кто-нибудь помочь?

1 Ответ

7 голосов
/ 06 апреля 2011

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 записывается в новый, локальный заголовок матрицы потока.

...