2013-08-03 106 views
5

我想爲我的作業做一個停車場檢測程序,但我是openCV和圖像處理的新手。OpenCV C++繪製矩形基於兩行

我打算做的是使用houghLine檢測停車場上的白線並畫出一個框。 但是,停車場的線不是一個完整的矩形。

例::

4nFaLkI.jpg

輸出我需要::

YMDuuHr.jpg

我能夠使用houghLine畫垂直線(紅線),但我有不知道如何加入行(綠線),以形成一個盒子,因爲houghLine檢測多個點線,它不會檢測直線的起點和終點。 我也嘗試凸包方法,但我沒有設法做到這一點。任何opencv函數都可以克服這個porlbem?

我真的不知道,希望任何人都可以給我一些想法來解決這個問題。 謝謝。

+0

你有Hough變換的直線方程。你必須在那條線上行走,找到顏色的不連續點:段的終點。不連續點從白色變爲灰色或從白色變爲綠色 –

+0

感謝您的回覆,您能否更詳細地解釋代碼?我發現opencv不能檢測色彩空間,並且可以跟蹤houghLine使用的顏色像素。 – user2649244

回答

1

您是否已檢出OpenCV doc中的示例?如果您使用功能HoughLinesP,您將得到線條的4個座標,因此繪製線條非常簡單。我複製例如,從DOC:

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); 
} 

在矢量lines你得到的圖像中的所有行的座標。一旦你選擇了停車場的兩條線,你只需要使用它們的座標來繪製新的線。例如,如果第一行是指數​​,第二個在k2,代碼可能會是這樣的:

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

謝謝,我知道如何獲得座標。不過,我需要系統自動繪製和加入線(綠線)來形成一個盒子。由於houghline檢測多點,我不知道如何檢測哪一點是線的終點 – user2649244

0

關於你的問題這點是線電子終點: 一條線是兩點之間的聯繫。一個點通過它的x,y座標來描述。 HoughLines檢測具有以下結果參數:矢量線; Vec4i是一個由4個整數(x1,y1,x2,y2)組成的向量,代表一條線的兩個點(起點和終點)。

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 

如果你想知道哪個點是,你只需要檢查點之間的座標,例如:

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

如果你需要一個矩形,它由您的四行,你現在可以做到這一點。像往常一樣在圖像處理中,有許多方法可以進入矩形。一個想法是這一個:

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 

如果你想提請你RotatedRect你可以使用自己的這個功能:

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); 
} 

調用這個函數有:

drawRotRect(img,rotRect);