OpenCV 将任意轮廓的形状转换为矩形
Posted
技术标签:
【中文标题】OpenCV 将任意轮廓的形状转换为矩形【英文标题】:OpenCV Transform Shape with Arbitrary Contour into Rectangle 【发布时间】:2015-09-09 14:34:02 【问题描述】:简短的问题是如何使用 OpenCV 将像下面这样的形状转换为矩形?
注意事项:
-
形状轮廓不一定是直线 - 它们可以是
略微弯曲。
形状内的内容必须沿着
相应的 x 和 y 轴。
长篇大论: 在一张纸被折叠 2 或 4 次后,我正在尝试纠正图像的扭曲,该图像表示一张带有文本、徽标等的纸,并使其几乎是完美的矩形。
输入图像已经是具有校正透视的黑白格式。所以一切都很好,只是它在扭曲的边缘周围有黑色区域并且文本有点波浪。
我的想法是顺序应该是这样的:
-
查找板材轮廓
计算校正矩阵以将形状区域映射到适当的矩形区域
使用计算矩阵变换图像
即类似于我们使用Imgproc.findContours
执行透视校正,然后找到纸张角,然后是Imgproc.getPerspectiveTransform
并最终使用Imgproc.warpPerspective
执行校正。
但我找不到适合这种情况的算法。
谁能指出如何在图像处理中实现它?
【问题讨论】:
你还没有走上正轨。您正在研究的转换是线性转换,可以类似于我的矩阵 docs.opencv.org/3.1.0/da/d54/… 。对于您的任务,您需要一些高度非线性的东西,因为您将一个任意轮廓映射到另一个。 你可能想看看这个:***.com/questions/32207085/… 【参考方案1】:在这种情况下,您希望对该图像进行非线性变换。传统上,您会使用整张纸的单一变换将其变成一个矩形。这可以只用角落来完成。更复杂的校正,如镜头失真,您需要在页面上选择点并断言它们应该是共面的以生成您的变换矩阵。基本上,您需要了解图像中的几何形状才能使其不失真。因此,您需要找到的几何图形是页面的 3 维表面。
为了找到损坏的纸张的高度非线性几何形状,您可以拍摄页面的多张图像并对它们进行三角测量。如果您想走这条路,请阅读 Hartley 和 Zisserman 的《Multiple View Geometry》。
【讨论】:
以上是关于OpenCV 将任意轮廓的形状转换为矩形的主要内容,如果未能解决你的问题,请参考以下文章