2011-04-06 126 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