5

我想为我的学校作业做一个停车场检测程序,但我是 openCV 和图像处理的新手。

我打算做的是使用 houghLine 检测停车场上的白线并画一个框。然而,停车场的线并不是一个完整的矩形。

例子 ::

4nFallkI.jpg

我需要的输出::

YMDuuHr.jpg

我可以使用 houghLine 绘制垂直线(红线),但我不知道如何加入线(绿线)以形成一个盒子,因为 houghLine 检测线的多个点,它不会检测起点和终点直线的点。我也尝试了凸包方法,但我没能做到。任何opencv函数都可以克服这个porlbem ??

我真的不知道,希望有人能给我一些解决问题的想法。谢谢你。

4

2 回答 2

1

您是否查看过OpenCV 文档中的示例?如果您使用该函数HoughLinesP,您将获得线条的 4 个坐标,因此绘制线条非常容易。我从文档中复制示例:

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中,您可以获得图像中所有线条的坐标。一旦你选择了停车场的两条线,你只需要使用它们的坐标来绘制新的线。例如,如果您的第一行在 indexk1中,第二行在 中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 );
于 2013-08-04T11:53:36.260 回答
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);
于 2015-04-10T08:34:12.430 回答