2011-11-21 13 views
12

İki resmim var, diğeri diğerinden daha küçük. İkinci görüntüyü ilk görüntüye kopyalamam gerekiyor. Bunu yapmak için ilk önce ROI'yi ayarlamalı, ikinci resmi ilk görüntüye kopyalamalı ve ardından ROI'yi sıfırlamalıyım.OpenCV'de ROI nasıl ayarlanır?

Ancak C++ arabirimini kullanıyorum, bu yüzden nasıl yapılacağını bilmiyorum. C'de cvSetImageROI kullanmış olabilirdim, ancak bu C++ arabiriminde çalışmıyor.

Temel olarak cvSetImageROI için C++ alternatifi nedir?

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

Bkz. Http://stackoverflow.com/questions/7041181/equivalent-to-cvsetimageroi-in-the-opencv-c-interface –

+0

Bunu zaten denedim. Hata görmüyorum, ancak YG'yi ayarladığım görüntü etkilenmiyor - aynı kalıyor. Görüntünün o kısmının bir kopyasına erişmekten ziyade bir kopyasını alıyorum. (Bence). – fdh

+0

copyTo işlevi, src ve dst matrislerinin biçimi eşleşmezse (yani, src = BGR, dst = BGRA) içeriği yeniden oluşturur. Bu durumda "imageROI.data" yeniden tahsis edilecek ve işaretçinin adresinin değiştirileceğini göreceksiniz. Öte yandan, imageROI başlığı aynı kalacaktır. Bu gibi durumlarda mixChannels, birleştirme veya cvtColor işlevlerini kullanın. – vahapt

cevap

16

Sanırım yanlış bir şeyiniz var. Birincisi diğerinden küçükse ve ilk görüntüyü ilk görüntüye kopyalamak istiyorsanız, bir ROI'ye ihtiyacınız yoktur. İlk görüntüye kopyalamak için ikinci resmi yeniden boyutlandırabilirsiniz. Eğer ikinci birinde ilkini kopyalamak istiyorsanız

Ancak, bu kod çalışması gerekir düşünüyorum:

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

veya daha kısa: Mat roiImg (img2, roi); – Ben

+0

Maalesef ikinci görüntünün ilkinden küçük olduğu ve ikincisini ilkine kopyalamak istediğim anlamına geliyor. Kodunu denedim ama işe yaramıyor. Resim 1 (ROI'unu değiştirmek istediğim resim I) hiç değişmedi. Yukarıdaki soruya kodumu ekledim. Başka önerileriniz var mı? – fdh

+0

Neden "img2 (roi) = img1 (roi)" çalışmıyor? – Delgan

3

Bu kullandığım koddur. Yorumların açıkladığını düşünüyorum.

/* 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); 

Ayrıca bu konuda yazdım ve bazı resimler koydum here.