e50ec93462f76ff3b683d038be3ed3a4.png

先放效果图:

39cf378b6635f001a9daa3453b103d7c.png

一个歪的数独棋盘

接下来,就是见证奇迹的时刻:

13f48a073d0bd770e7ce4039d41bafea.png

矫正之后的棋盘(只保留棋盘部分)

在没有看到opencv里面的几何变换之前,我一直都疑惑着说一些软件上面的自动矫正是什么原理,现在opencv里面的cv2.getPerspectiveTransform() 和cv2.warpPerspective()解决了我都疑惑。

在opencv中图像的几何变换主要缩放(scaling)、 旋转(rotation)(带缩放功能)、映射变换(affine/perspective transform)等。这里主要讲映射变换【affine/perspective transform】

affine transform 和 perspective transform的共同点都是通过输入点和输出点来计算映射矩阵。不同的是,affine transform需要的是输入个点坐标,以及这个点对应的输出坐标。perspective tranform需要的是输入个点坐标,以及这个点对应的输出坐标。这是他们的最大最大的不同。上面的图片矫正使用的是perspective tranform方法。

所以要得到将一个图片矫正,只需直到原图像上面的四个点和目标图像上与原图像对应的四个点即可(NOTE:任意三点不能共线),下面是直接的代码,很简短。cv大法好!!!

# load a image

4bd715e4d19eb523a9fd353b3b6c5fad.png
原图是四个标记点

4e5a7eadc11a7374b4bb4fd8fa6c2981.png
矫正后图片的四个对应的点

附录:

我还试了一下用affine的方法。

09f0bc0d215d46597c343041821c23d6.png
显然affine transform的方法不是很好

从图中可以看到,affine transform的效果没有perspective的方法好。原因是affine只使用了三个点,显然三个点并不能唯一确定一个矩形,所以总会有一个角落的部分是未矫正的。而perspective transform是四个点,则可以确定一个唯一的矩形了。

欢迎大家批评指正,共同进步^_^

############################# END #############################

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐