【问题标题】:OpenCV C++ Draw Rectangle Based on two lineOpenCV C++ 基于两条线绘制矩形
【发布时间】:2013-08-03 20:08:02
【问题描述】:

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

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

示例 ::

我需要的输出::

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

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

【问题讨论】:

  • 你有霍夫变换的线方程。你必须走在那条线上并找到颜色的不连续性:线段的终点。不连续性正在从白色变为灰色或从白色变为绿色
  • 感谢您的回复,您能详细解释一下代码吗?我发现 opencv 无法检测颜色空间并且可以跟踪 houghLine 使用的颜色像素?

标签: c++ opencv image-processing


【解决方案1】:

您是否查看过OpenCV doc 中的示例?如果你使用函数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 中,您可以获得图像中所有线条的坐标。一旦你选择了停车场的两条线,你只需要使用它们的坐标来绘制新的线。例如,如果第一行在索引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 );

【讨论】:

  • 谢谢,我知道如何获取坐标。但是我需要系统自动绘制并加入线(绿线)来形成一个盒子。由于 houghline 检测到多个点,我不知道如何检测哪个点是线的终点
【解决方案2】:

关于你的问题哪一点是一条线的终点: 线是两点之间的连接。一个点通过它的 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

如果你想知道哪个Point在哪里,你只需要检查点之间的坐标,例如:

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

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多