2012-10-17 20 views
10

Olası Çoğalt:
Understanding region of interest in openCV 2.4OpenCV alt görüntü

i bir görüntüden bir alt görüntü (aşağıda kırmızı kutu ile sınırlanmış bir) almak istiyorum (Mat formatı). Bunu nasıl yaparım?

enter image description here

burada benim Bugüne dek var:

include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

using namespace std; 
using namespace cv; 
int main() 
{ 
    Mat imgray, thresh; 
    vector<vector<Point> >contours; 
    vector<Point> cnt; 
    vector<Vec4i> hierarchy; 
    Point leftmost; 

    Mat im = imread("igoy1.jpg"); 
    cvtColor(im, imgray, COLOR_BGR2GRAY); 
    threshold(imgray, thresh, 127, 255, 0); 
    findContours(thresh, contours, hierarchy, RETR_TREE,CHAIN_APPROX_SIMPLE); 
} 
+1

Bu soru olarak zaten istedi ve, cevaplanmış ([buradan] azından http://stackoverflow.com/questions/12705817/understanding-region-of-interest- in-opencv-2-4/12706208 # 12706208) ve [orada] (http://stackoverflow.com/questions/12369697/access-sub-matrix-of-a-multidimensional-mat-in-opencv/12370641#12370641 – remi

cevap

24

Bir kontur toplama başlayabilir (sizin durumunuzda, elin karşılık gelen kontur). Ardından, bu kontur için sınırlayıcı dikdörtgeni hesaplarsınız. Sonunda, bundan yeni bir matris başlığı oluşturursunuz.

int n=0;// Here you will need to define n differently (for instance pick the largest contour instead of the first one) 
cv::Rect rect(contours[n]); 
cv::Mat miniMat; 
miniMat = imgray(rect); 

Uyarı: Bu durumda, Minimat imgray bir alt bölge olduğunu. Bu, birinciyi değiştirirseniz, ikincisini de değiştirdiğiniz anlamına gelir. Bunu önlemek için miniMat.copyTo(anotherMat) kullanın. Ben yardımcı umut

, İyi şanslar

+1

Teşekkürler! Doğru çıktıya sahip bir çıktı aldım ama aynı zamanda diğer konturları da içeriyor. RETR_TEX yerine RETR_EXTERNAL kullandım, böylece daha az kontur olacak. Hangi konturun doğru olduğunu nasıl tanımlarım? –

+1

@OgNamdik Konturlar arasında geçiş yapabilir ve her biri için sınırlayıcı dikdörtgenin (veya diğer parametrelerin) alanını veya alanını hesaplayabilirsiniz. Durumunuzda, sadece en büyük alana sahip olan konturu tutabiliyorsunuz ... Ayrıca, eğer mutluysanız cevabı kabul etmekte tereddüt etmeyin. : D –

+0

tamam çok teşekkür ederim! –