2016-09-06 9 views
3

이미지의 일부를 추출하기 위해 GetSubImage 함수를 구현했습니다. SetROI, CopyResetROI을 사용합니다. 그러나 이것은 병렬 작업이 SetROI이 병렬화가 불가능하므로 동일한 이미지를 사용할 때 작동하지 않습니다.OpenCV : 이미지의 일부를 추출하는 동시 GetSubImage

동시 실행 가능한 이미지 부분을 추출하는 다른 방법은 없습니까?

답변

1

행렬의 일부만 가리키는 임시 매트릭스 머리글을 만들 수 있습니다. 그런 다음 해당 머리글에 copyTo() 멤버 함수를 사용할 수 있습니다. C++의 예 : 동시에 그것을 수행 할 수 있도록

Mat GetSubImage(const Mat& source, const Rect &region) 
{ 
    Mat dest; 
    Mat roi(source, region); 
    roi.copyTo(dest); 
    return dest; 
} 

이 방법은 데이터 나 source의 헤더도이 조작에 의해 영향을받습니다.

+0

감사합니다. 하지만 OpenCvSharp 라이브러리 및 CvMat 클래스를 사용하고 있습니다 thins 생성자가 없습니다 ... –

+0

그게 무슨 소리 죠? 바로 거기에 있습니다 : http://shimat.github.io/opencvsharp/html/bf9a14ed-6ebb-704b-2372-7e104ef77196.htm – ypnos

1

마지막으로 이미지의 일부를 추출하려면이 함수를 사용하고 있습니다. C# 및 OpenCVSharp 래퍼와 함께 사용 :

static public IplImage GetSubImage(IplImage ipl, CvRect r) 
    { 
     CvMat submat; 
     CvMat mat = ipl.GetSubRect(out submat, r); 
     IplImage i = new IplImage(r.Width, r.Height, ipl.Depth, ipl.NChannels); 
     Cv.Copy(mat, i); 

     mat.Dispose(); 
     submat.Dispose();   

     return i; 
    } 
+0

시간을내어 솔루션을 게시 해 주셔서 감사합니다! 그 정신이야! 나는 현대 API로 전환 할 것을 제안 할 수 있습니다. 그것은 OpenCV 2.0에서 소개되었으며 3.1 버전입니다. – ypnos

+0

어떤 API입니까? 이 https://github.com/shimat/opencvsharp를 사용하고 있으며 매우 완벽하고 완벽합니다. –

+0

예 OpenCVSharp에는 두 개의 API가 있습니다. 이전 OpenCV 1.x 버전과 새로운 OpenCV 2.x, 3.x 버전. https://github.com/shimat/opencvsharp#usage를 참조하십시오. CvMat, IplImage가 있습니까? 아니! 왜냐하면 그것들은 그들의 예제에서 사용하고있는 새로운 API이기 때문입니다. Mat == new, CvMat == old. – ypnos