我正在尝试制作一个自动校正矩形透视的程序。我已经设法得到矩形的轮廓,并有代码来纠正透视,但我找不到角落。最大的问题是,因为它已经变形,我不能使用以下“代码”:
c1 = min(x), min(y)
c2 = max(x), min(y)
c3 = min(x), max(y)
c4 = max(x), max(y)
这不适用于这种情况(X代表一个角落):
X0000000000X
.00000000000
..X000000000
.....0000000
........0000
...........X
有谁知道怎么做?
答案 0 :(得分:5)
离中心最远的地方会给你一个角落。 离第一个角落最远的点会给你另一个角落,它可能与第一个角落相邻或相对。 距离这两个角之间的线最远的点(更加强大的数学运算)将为您提供第三个角。我使用距离中心的距离作为打破平局。 为了找到第四个角,它将是你发现的前3个角形成的三角形外的点,距离这些角之间最近的线最远。
这是一个非常耗时的方法,我从来没有尝试过,但它应该工作。
答案 1 :(得分:4)
您可以尝试使用扫描线算法 - 对于多边形的每一行(因此y = min(y).. max(y)),得到l = min(x)和r = max(x)。计算左/右斜率(deltax)并将其与之前的斜率进行比较。如果它改变了(在这里使用了一些公差),你就在矩形的一角(或靠近它)。这对所有情况都不适用,因为斜率因低分辨率而不能精确,但对于大矩形和斜率不太相似,这应该可行。
至少,它适用于您的示例:
X0000000000X l = 0, r = 11
.00000000000 l = 1, r = 11, deltaxl = 1, deltaxr = 0
..X000000000 l = 2, r = 11, deltaxl = 1, deltaxr = 0
.....0000000 l = 5, r = 11, deltaxl = 3, deltaxr = 0
........0000 l = 8, r = 11, deltaxl = 3, deltaxr = 0
...........X l = 11, r = 11, deltaxl = 3, deltaxr = 0
从矩形的顶部开始,您将获得l和r的两个不同值,因此您已经有两个角。在左侧,对于前三行,您将获得deltax = 1,但在此之后,您将获得deltax = 3,因此在(3,3)处有一个角。在右侧,没有任何变化,deltax = 0,所以你只能得到最后的点。
请注意,你在这里“收集”角落,所以如果你的末端没有4个角落,那么斜坡太相似了(或者你有一个三角形的图片),你可以切换到另一个角落(更精确的算法或只是给出一个错误。如果你有超过4个角落或其他一些奇怪的东西,如矩形中的洞,则相同。似乎涉及某种图像检测,所以这些情况可能发生,对吗?
有些情况下,简单的deltax =(x - lastx)不能正常工作,请参见矩形左侧的示例:
xxxxxx
xxxxx deltax = 1 dy/dx = 1/1 = 1
xxxxx deltax = 0 dy/dx = 2/1 = 2
xxxx deltax = 1 dy/dx = 3/2 = 1.5
xxxx deltax = 0 dy/dx = 4/2 = 2
xxx deltax = 1 dy/dx = 5/3 = 1.66
有时deltax为0,有时为1.最好使用从实际点到左上/右上角(deltay / deltax)的直线斜率。使用它,您仍然需要坚持公差,但每个新线的价值都会更准确。
答案 2 :(得分:3)
您可以使用霍夫变换找到蒙版图像中最突出的4条线。这些线将是四边形的边。 这些线将最多相交6个点,即4个角和2个透视消失点。
这些很容易区分:选择四边形内的任何点,并检查从该点到6个交叉点中的每一个的线是否与任何线相交。如果没有,那么那个交叉点就是一个角落。
这样做的好处是即使对于噪点或部分遮挡的图像,或者如果您的分割不准确,它也能正常工作。
en.wikipedia.org/wiki/Hough_transform
我对你的结果很感兴趣。我一直在考虑自己写这样的东西,以纠正以某个角度拍摄的纸张照片。如果已知4点,我目前正在努力想出一种纠正视角的方法
同时退房 张正友,何立伟,“白板扫描与图像增强” http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf 用于更高级的四边形检测解决方案
我问了一个相关的问题,试图解决透视变换: proportions of a perspective-deformed rectangle
答案 3 :(得分:2)