2011-04-06 4 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를 사용하는 것입니다!

거기에 IplImage 대신 cv :: Mat가 있습니다. 그런 다음 다음과 같은 코드를 사용할 수 있습니다.

// 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