python在OpenCV里实现投影变换效果

yipeiwu_com6年前Python基础

前面学习了仿射变换,是经常使用到的变换,也很容易理解。在日常生活中,经常会遇到下面这种的情况:

仔细地观察比亚迪秦这台汽车的车牌,发现它拍照的角度不是垂直的方向,而是有一个角度,当要进行车牌识别的时候,发现字符是变形的,与电脑里比较的图片肯定有区别,因此识别不出来。这时怎么办呢?就需要经过一个投影变换才可以把车牌号纠正过来,才能进入识别过程。

好吧,到这里认识到投影变换的感性认识了,那么你又会继续考虑下一个问题,在软件里怎么样计算呢,难道还是使用仿射变换的矩阵。从这里看一下,前面闽A比较大,后面88比较小,说明原本平行的两边已经不平行了。仿射变换之后,平行的线还是平行的,因此这一点也是仿射变换与投影变换的区别。

投影变换只是保证同一条直线的点还是在同一条直线上,但不再保证平行了。因为投影变换是一个二维图像(车牌)经过一个三维变换,然后映射到另外一个二维空间,二维图像的二维空间与映射后的二维空间不一样,如果一样,就是仿射变换。投影变换也可以使用矩阵来进行描述,如下:

投影变换的矩阵是8个未知数,所以要四组不同的坐标点才可以计算出来,与前面的矩阵比较一下:

在OpenCV里是使用下面的公式计算:

因此只要构造了投影变换矩阵,其它的计算与仿射变换是一样的。下面通过例子来演示投影变换的功能:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#图片的路径
imgname = "img1.jpg"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
#图片的高度和宽度
h,w = image.shape[:2]
#从目标坐标计算出3X3的矩阵,然后调用warpPerspective执行
src = np.array([[0,0],  [w-1,0],  [0,h-1], [w-1,h-1]], np.float32)
dst = np.array([[100,50], [w/2.0,50], [100,h-1], [w-1,h-1]], np.float32)
A1 = cv2.getPerspectiveTransform(src, dst)
d1 = cv2.warpPerspective(image, A1, (w, h), borderValue = 125)
#显示操作之后的图片
cv2.imshow("d1",d1)
#显示图像
cv2.imshow("image", image)
#等待用户输入,然后删除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

在这个例子里,先行构造四组坐标点,然后调用getPerspectiveTransform函数计算投影变换矩阵,然后调用函数warpPerspective来计算变换。如果要纠正图片,也是一样的,只要给出前后的四组的坐标值即可。

总结

以上所述是小编给大家介绍的python在OpenCV里实现投影变换效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

Python实现查找字符串数组最长公共前缀示例

本文实例讲述了Python实现查找字符串数组最长公共前缀。分享给大家供大家参考,具体如下: 编写一个函数来查找字符串数组中的最长公共前缀。 class Solution: def...

django解决订单并发问题【推荐】

并发处理 在多个用户同时发起对同一个商品的下单请求时,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常。 解决办法: 悲观锁 当查询某条记录时,即让数...

python中查找excel某一列的重复数据 剔除之后打印

1.在python中excel的简单读写操作,推荐使用xlrd(特别是读操作) 2.到http://pypi.python.org/pypi/xlrd 去下载 xlrd库; 3.工程代码...

ActiveMQ:使用Python访问ActiveMQ的方法

ActiveMQ:使用Python访问ActiveMQ的方法

Windows 10家庭中文版,Python 3.6.4,stomp.py 4.1.21 ActiveMQ支持Python访问,提供了基于STOMP协议(端口为61613)的库。 Act...

树莓派与PC端在局域网内运用python实现即时通讯

电脑和树莓派在同一局域网内,先在电脑和树莓派创建python运行环境,然后在树莓派中用python运行rpi.py;在电脑上运行computer.py;电脑上输入字符即可在树莓派上即时显...