2013-08-03 87 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);