目前我已经检测到图像中的边缘,并且我计划使用霍夫变换从边缘提取线段。一旦我有了这些片段,我就会计划找到两个片段交叉的角落。是否有可以从角落检测矩形的算法?说我检测到了四个角,是否可以得到四个角组成的矩形边的相对长度,知道矩形有4个直角?
我想这样做的原因是我可以提取由矩形绑定的纹理并将其绘制为屏幕上的扁平矩形。
编辑: 感谢到目前为止的答案,我想我应该更清楚地解释我的问题,因为我认为我有点误解。我实际上是想将一个扭曲的矩形变换成一个扁平的矩形。我阅读了一些aforge文章并看到了这个函数:link。我想知道是否可以从4个角确定矩形边之间的比例?
答案 0 :(得分:3)
您已经在使用所需的工具 - Hough transform。
Hough变换的标准公式用于识别图像中的线条,方法是从图像的(x,y)
空间转换为可能线条的(theta,d)
解空间。
您可以通过从图像的(x,y)
空间转换为可能的矩形(theta,d,width,height,rotation)
的解空间来识别候选矩形。
采用这种方法保留了霍夫变换的优势,可以处理图像中部分可见的特征 - 使用霍夫变换识别边缘,并将这些边缘组合成矩形的两步法将无法识别矩形一个边缘或角落被充分遮挡。
答案 1 :(得分:0)
使用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框架的链接:
http://www.aforgenet.com/framework/downloads.html
答案 2 :(得分:0)