2011-11-21 4 views
12

두 이미지가 있는데 첫 번째 이미지는 다른 이미지보다 작습니다. 첫 번째 이미지에 두 번째 이미지를 복사해야합니다. 이렇게하려면 먼저 ROI를 설정하고 두 번째 이미지를 첫 번째 이미지로 복사 한 다음 ROI를 다시 설정해야합니다.OpenCV에서 ROI를 설정하는 방법은 무엇입니까?

그러나 C++ 인터페이스를 사용하고 있으므로이 방법을 모릅니다. C에서 나는 cvSetImageROI를 사용할 수 있었지만 C++ 인터페이스에서는 작동하지 않습니다.

그래서 기본적으로 cvSetImageROI에 대한 C++ 대안은 무엇입니까?

//output is a pointer to the mat whom I want the second image (colourMiniBinMask) copied upon 
Rect ROI (478, 359, 160, 120); 

Mat imageROI (*output, ROI); 

colourMiniBinMask.copyTo (imageROI); 

imshow ("Gravity", *output); 
+3

참조 http://stackoverflow.com/questions/7041181/equivalent-to-cvsetimageroi-in-the-opencv-c-interface –

+0

이미 시도해 보았습니다. 오류는 없지만 ROI를 설정 한 이미지는 영향을받지 않습니다. 이는 그대로 유지됩니다. 나는 그 이미지에 접근하지 않고 그 부분의 복사본을 얻는 중이다. (나는 생각한다). – fdh

+0

src와 dst 행렬의 형식이 일치하지 않으면 (src = BGR, dst = BGRA) copyTo 함수가 콘텐츠를 재생성합니다. 이 경우 "imageROI.data"가 다시 할당되고 포인터 주소가 변경됩니다. 반면에 imageROI의 헤더는 그대로 유지됩니다. 그러한 경우에는, mixChannels, merge 또는 cvtColor 함수를 사용한다. – vahapt

답변

16

내가 잘못 생각한 것 같습니다. 첫 번째 이미지가 다른 이미지보다 작 으면 첫 번째 이미지에서 두 번째 이미지를 복사하려면 ROI가 필요하지 않습니다. 두 번째 이미지의 크기를 첫 번째 이미지로 복사 할 때 크기를 조정할 수 있습니다. 당신이 두 번째로 첫 번째를 복사 할 경우

그러나,이 코드가 작동해야한다고 생각 :

cv::Rect roi = cv::Rect((img2.cols - img1.cols)/2,(img2.rows - img1.rows)/2,img1.cols,img1.rows); 

cv::Mat roiImg; 
roiImg = img2(roi); 

img1.copyTo(roiImg); 
+4

이하 : MatroiImg (img2, roi); – Ben

+0

죄송합니다. 두 번째 이미지가 첫 번째 이미지보다 작고 두 번째 이미지를 첫 번째 이미지로 복사하려고합니다. 코드를 사용해 보았지만 작동하지 않습니다. 이미지 1 (ROI를 변경하고 싶은 이미지 I)은 전혀 변경되지 않았습니다. 위의 질문에 내 코드를 포함 시켰습니다. 다른 제안? – fdh

+0

왜'img2 (roi) = img1 (roi)'가 좋지 않을까요? – Delgan

3

이 내가 사용하는 코드입니다. 나는 그 의견이 그것을 설명한다고 생각한다.

/* ROI by creating mask for the parallelogram */ 
Mat mask = cvCreateMat(480, 640, CV_8UC1); 
// Create black image with the same size as the original 
for(int i=0; i<mask.cols; i++) 
    for(int j=0; j<mask.rows; j++) 
     mask.at<uchar>(Point(i,j)) = 0; 

// Create Polygon from vertices 
vector<Point> approxedRectangle; 
approxPolyDP(rectangleVertices, approxedRectangle, 1.0, true); 

// Fill polygon white 
fillConvexPoly(mask, &approxedRectangle[0], approxedRectangle.size(), 255, 8, 0);     

// Create new image for result storage 
Mat imageDest = cvCreateMat(480, 640, CV_8UC3); 

// Cut out ROI and store it in imageDest 
image->copyTo(imageDest, mask); 

나는 또한 이것에 관해 썼고 어떤 그림을 넣었다 here.

관련 문제