【问题标题】:Trying to find an algorithm to detect rectangles in images试图找到一种算法来检测图像中的矩形
【发布时间】:2011-10-25 23:21:54
【问题描述】:

目前我已经检测到图像中的边缘,并且我计划使用霍夫变换从边缘中提取线段。一旦我有了这些部分,我就计划找到两个部分交叉的角落。有没有一种算法可以从角落检测矩形?假设我检测到四个角,是否可以得到四个角组成的矩形边的相对长度,知道一个矩形有 4 个直角?

我想这样做的原因是我可以提取由矩形绑定的纹理并将其绘制为屏幕上的平面矩形。

编辑: 感谢到目前为止的答案,我认为我应该更清楚地解释我的问题,因为我认为我被误解了。我实际上是在尝试将扭曲的矩形转换为扁平矩形。我阅读了一些 aforge 的文章,看到了这个功能:link。我想知道是否可以仅从 4 个角确定矩形边之间的比率?

【问题讨论】:

  • 我认为你不能仅从图片中确定比例。您需要更多信息。比如如果同一张图有方块,或者你知道透视参数等等……

标签: c# computer-vision hough-transform line-segment


【解决方案1】:

您已经在使用您需要的工具 - Hough transform

霍夫变换的标准公式用于识别图像中的线条,方法是将图像的(x,y) 空间转换为可能线条的(theta,d) 解空间。

您可以通过将图像的(x,y) 空间转换为可能的矩形(theta,d,width,height,rotation) 的解决方案空间来执行相同的操作来识别候选矩形。

采用这种方法可以保留 Hough 变换的优势,以处理图像中的部分可见特征 - 使用 Hough 变换识别边缘并将这些边缘组合成矩形的两步方法将无法识别矩形,如果一个边缘或角落被充分遮挡。

【讨论】:

    【解决方案2】:

    她是一些代码,可用于使用 AForge.NET Framework 检测图像中的四边形:

    // get angles between 2 pairs of opposite sides
    float angleBetween1stPair = Tools.GetAngleBetweenLines(corners[0], corners[1], corners[2], corners[3]);
    float angleBetween2ndPair = Tools.GetAngleBetweenLines(corners[1], corners[2], corners[3], corners[0]);
    
    // check 1st pair for parallelism
    if (angleBetween1stPair <= angleError)
    {
        subType = PolygonSubType.Trapezoid;
    
        // check 2nd pair for parallelism
        if (angleBetween2ndPair <= angleError)
        {
            subType = PolygonSubType.Parallelogram;
    
            // check angle between adjacent sides
            if (Math.Abs(Tools.GetAngleBetweenVectors(corners[1], corners[0], corners[2]) - 90) <= angleError)
                subType = PolygonSubType.Rectangle;
    
            //get length of 2 adjacent sides
            float side1Length = (float)corners[0].DistanceTo( corners[1] );
            float side2Length = (float)corners[0].DistanceTo( corners[3] );
    
            if (Math.Abs(side1Length - side2Length) <= maxLengthDiff)
                subType = (subType == PolygonSubType.Parallelogram) ? PolygonSubType.Rhombus : PolygonSubType.Square;
        }
    }
    else
    {
        // check 2nd pair for parallelism - last chence to detect trapezoid
        if (angleBetween2ndPair <= angleError)
        {
            subType = PolygonSubType.Trapezoid;
        }
    }
    

    有关如何检测各种形状的示例,请参阅本文:
    http://www.aforgenet.com/articles/shape_checker/

    这里是下载 AForge.NET Framework 的链接:
    http://www.aforgenet.com/framework/downloads.html

    【讨论】:

    • 感谢您到目前为止的回答,我认为我应该更清楚地解释我的问题,因为我认为我被误解了。我实际上是在尝试将扭曲的矩形转换为扁平矩形。我阅读了一些 aforge 的文章,看到了这个功能:link。我想知道是否可以仅从 4 个角确定矩形边之间的比率?
    【解决方案3】:
    猜你喜欢
    • 2021-11-30
    • 2014-04-30
    • 2016-09-19
    • 2011-08-22
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多