OpenCV C ++绘制矩形基于两行

时间:2013-08-03 20:08:02

标签: c++ opencv image-processing

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

我打算做的是使用houghLine来检测停车场上的白线并画一个盒子。 但是,停车场的线路不是一个完整的矩形。

示例::

4nFaLkI.jpg

我需要的输出::

YMDuuHr.jpg

我能够使用houghLine绘制垂直线(红线),但我不知道如何加入线(绿线)以形成一个方框houghLine检测线的多个点,它不会检测直线的起点和终点。 我也尝试凸壳方法,但我没有设法做到这一点。任何opencv函数都可以克服这个问题吗?

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

2 个答案:

答案 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);