我想为我的学校作业做一个停车场检测计划,但我是openCV和图像处理的新手。
我打算做的是使用houghLine来检测停车场上的白线并画一个盒子。 但是,停车场的线路不是一个完整的矩形。
示例::
我需要的输出::
我能够使用houghLine绘制垂直线(红线),但我不知道如何加入线(绿线)以形成一个方框houghLine检测线的多个点,它不会检测直线的起点和终点。 我也尝试凸壳方法,但我没有设法做到这一点。任何opencv函数都可以克服这个问题吗?
我真的不知道,希望有人能给我一些解决问题的想法。 谢谢。
答案 0 :(得分: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
中,您可以获得图像中所有线条的坐标。一旦选择了停车场的两条线,您只需使用它们的坐标绘制新线。例如,如果第一行是索引k1
而第二行是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 );
答案 1 :(得分:0)
关于你的问题哪一点是一条线的终点: 一条线是两点之间的连接。通过其x,y坐标描述点。 HoughLines Detection有结果参数:矢量线; 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);