2013-08-03 14 views
5

Okul atama için bir otopark lotu tespit programı yapmak istiyorum, ancak openCV ve görüntü işlemlerinde de çaylak oluyorum.OpenCV C++ Draw Rectangle İki satırdan yola çıkarak

Yapmayı planladığım şey, otoparktaki beyaz çizgiyi bulmak ve bir kutu çizmek için houghLine kullanmaktır. Bununla birlikte, otoparkın çizgisi tam bir dikdörtgen değil.

Örnek ::

4nFaLkI.jpg

i :: gerek çıkış

YMDuuHr.jpg

Ben var ama dikey çizgi (Kırmızı Hat) çizmek için houghLine kullanabilmek için houghLine birden fazla noktayı algıladığından, bir kutu oluşturmak için (yeşil çizgi yeşil çizgi) nasıl bir fikre sahip olunur satır, düz çizginin başlangıç ​​noktasını ve bitiş noktasını algılamaz. Ayrıca dışbükey gövde yöntemini de deniyorum ama bunu başaramadım. Herhangi bir opencv işlevi bu porlbem üstesinden gelebilir?

Gerçekten hiç bir fikrim yok ve herkesin sorunu çözmek için bana biraz fikir verebilir. Teşekkürler.

+0

size RotatedRect çizmek istiyorsanız

vector<Point> RoiPoints; RoiPoints.push_back(pointA); RoiPoints.push_back(pointB); ... push all start and end points of your lines into this vector RotatedRect rotRect = minAreaRect(Mat(RoiPoints)); ... the RotatedRect fits around all points in your vector 

Eğer kendimi bu işlevi kullanabilirsiniz: Bir fikir bu bir olurdu Hough dönüşümünden satır denklemi. Bu çizgide yürümeli ve süreksizliği renkte bulmalısınız: segmentin bitiş noktası. devamsızlık beyazdan griye veya beyazdan yeşile –

+0

cevabınız için teşekkürler, kod hakkında biraz daha açıklayabilir misiniz? Opencv'in renk alanını ve houghLine'in kullandığı renk pikselini izleyebildiğini tespit edemedim. – user2649244

cevap

1

Örneğini OpenCV doc'da teslim ettiniz mi? HoughLinesP işlevini kullanırsanız, çizgilerin 4 koordinatını alırsınız, böylece çizgilerin çizilmesi oldukça kolaydır. Ben doktordan örnek kopyalayın:

vector<Vec4i> lines; 
HoughLinesP(dst, lines, 1, CV_PI/180, 80, 30, 10); 
for(size_t i = 0; i < lines.size(); i++) 
{ 
    line(color_dst, Point(lines[i][0], lines[i][1]), 
     Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8); 
} 

vektör size görüntüdeki tüm hatlar koordinatlarını almak lines. Otoparkın iki hattını seçtikten sonra, yeni çizgileri çizmek için koordinatlarını kullanmanız yeterlidir.

line(color_dst, Point(lines[k1][0], lines[k1][1]), 
    Point(lines[k2][0], lines[k2][1]), Scalar(0,0,255), 3, 8); 
line(color_dst, Point(lines[k1][2], lines[k1][3]), 
    Point(lines[k2][2], lines[k2][3]), Scalar(0,0,255), 3, 8); 
+0

Teşekkürler ve koordinatı nasıl alacağımı biliyorum. Bununla birlikte, sistem otomatik çekmeye ihtiyacım var ve bir kutu oluşturmak için çizgiye (Yeşil çizgi) katıl. Pürüz çizgisi birden fazla noktayı algıladığından, hangi noktanın bitiş noktası olduğunu nasıl algılayacağımı bilmiyorum. – user2649244

0

Sorunuza gelince noktası bir satırın E uç noktasıdır: Bir çizgi size ilk satırı endeksi k1 ve k2 ikinci birinde ise Örneğin, kod muhtemelen böyle bir şey olacak iki nokta arasındaki bir bağlantıdır. X, y koordinatları ile bir nokta tarif edilmiştir. HoughLines Detection, sonuç parametresine sahiptir: vektör çizgileri; Vec4i, bir çizginin iki noktasını (başlangıç ​​noktası ve bitiş noktası) temsil eden 4 tamsayı (x1, y1, x2, y2) vektörüdür.

Point pointA(lines[i][0],lines[i][1]); 
Point pointB(lines[i][2],lines[i][3]); 
    i represents the index of one of your lines 

Eğer Nokta nerede, sadece, örneğin nokta arasındaki koordinatları kontrol etmek zorunda olduğunu bilmek isterseniz:

pointA.x > pointB.x or pointA.y > pointB.y 

Eğer dört satırdan oluşuyor bir dikdörtgen, gerekiyorsa bunu şimdi yapabilirsin. Görüntü işlemede her zamanki gibi, dikdörtgeninize ulaşmak için birçok yol vardır.

void drawRotRect(Mat& img, RotatedRect& rect) 
{ 
    Point2f rect_points[4]; 
    rect.points(rect_points); 

    //draw rotated rect 
    for (int j = 0; j < 4; j++) 
    line(img, rect_points[j], rect_points[(j + 1) % 4],Scalar(0,0,255),1, 8); 
} 

çağrı bu fonksiyon ile: You have

drawRotRect(img,rotRect);