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


Posted in Python onAugust 30, 2019

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

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

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

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

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

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

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

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

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

python在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()

结果输出如下:

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

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

总结

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

Python 相关文章推荐
python批量修改文件后缀示例代码分享
Dec 24 Python
Python实现的几个常用排序算法实例
Jun 16 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
Python如何绘制日历图和热力图
Aug 07 Python
python实现人工蜂群算法
Sep 18 Python
python3中TQDM库安装及使用详解
Nov 18 Python
Python爬取梨视频的示例
Jan 29 Python
详解NumPy中的线性关系与数据修剪压缩
May 25 Python
python 模拟贷款卡号生成规则过程解析
Aug 30 #Python
Python之数据序列化(json、pickle、shelve)详解
Aug 30 #Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 #Python
python获取Linux发行版名称
Aug 30 #Python
python实现ip地址查询经纬度定位详解
Aug 30 #Python
Django 对IP访问频率进行限制的例子
Aug 30 #Python
关于Python3 类方法、静态方法新解
Aug 30 #Python
You might like
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
js实现选项卡效果
2020/03/07 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
Nest.js散列与加密实例详解
2021/02/24 Javascript
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
服装行业创业计划书范文
2014/02/05 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
先进单位事迹材料
2014/12/25 职场文书
安全承诺书
2015/01/19 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
浅谈Python协程asyncio
2021/06/20 Python