几何变换之透视---OpenCV-Python开发指南(13)
发布日期:2021-06-30 21:24:39
浏览次数:3
分类:技术文章
本文共 1671 字,大约阅读时间需要 5 分钟。
目录
更复杂的仿射变化
上篇博文讲解了2种最基本的仿射变换:平移与旋转。但OpenCV还给我们提供了函数cv2.getAffineTransform()来生成仿射函数cv2.warpAffine()所使用的转换矩阵M。
该函数的定义如下:
def getAffineTransform(src, dst):
src:代表输入图像的三个点坐标
dst:代表输出图像的三个点坐标
用过PS的都知道,我们在PS中使用快捷键Ctrl+T就可以随意拉扯图像,因为图像上下左右各有四个点负责定位。而src中的3个坐标与PS完全一致,分别为左上角,右上角,左下角,只是少了一个点,但定位绰绰有余,当然映射后只能是平行四边形,因为缺失一个坐标。
下面,我们来随意定位图像,并实现拉扯效果:
import cv2import numpy as npimg = cv2.imread("4.jpg")rows,cols,ch = img.shapep1=np.float32([[0,0],[cols-1,0],[0,rows-1]])p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])M = cv2.getAffineTransform(p1,p2)move_img = cv2.warpAffine(img, M, (cols, rows))cv2.imshow("img", img)cv2.imshow("move_img", move_img)cv2.waitKey()cv2.destroyAllWindows()
运行之后,效果如下图所示:
p1是原始图像的坐标,这里稍微有点变换。原图坐标就是左上角[0,0],右上角[cols,0],左下角[0,rows]。变换后的坐标左上角[0,rows0.33],右上角[cols0.85,rows0.25],左下角[cols0.15,rows*0.7]。透视
之所以要讲解上面的平行四边形仿射,是因为我们的透视是任意四边形,通过上面的代码我们更容易理解透视的概念。
在OpenCV中,透视变换通过函数cv2.warpPerspective()实现,该函数的定义如下:
def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):
src:要透视的原始图像
M:变换透视图像的3*3变换矩阵
dsize:代表输出图像的尺寸大小
flags,borderMode,borderValue三个参数与前文类似这里不多做介绍。
下面,我们将上面的图像变换成任意四边形,具体代码如下所示:
import cv2import numpy as npimg = cv2.imread("4.jpg")rows, cols, ch = img.shapep1 = np.float32([[0, 0], [cols, 0], [0, rows], [cols, rows]])p2 = np.float32([[0, rows * 0.33], [cols * 0.85, rows * 0.25], [cols * 0.15, rows * 0.7], [cols * 0.85, rows * 0.85]])M = cv2.getPerspectiveTransform(p1, p2)move_img = cv2.warpPerspective(img, M, (cols, rows))cv2.imshow("img", img)cv2.imshow("move_img", move_img)cv2.waitKey()cv2.destroyAllWindows()
透视函数warpPerspective通过getPerspectiveTransform获得变换矩阵。运行之后,效果如下所示:
转载地址:https://liyuanjinglyj.blog.csdn.net/article/details/113802729 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月29日 18时19分49秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
手写LogisticRegression
2019-05-01
SQL经典题目总结
2019-05-01
剑指offer编程题,一周刷完
2019-05-01
推荐系统初学
2019-05-01
Map的遍历和排序
2019-05-01
约瑟夫环问题
2019-05-01
springboot+log4j2体验
2019-05-01
redis集群启动方式
2019-05-01
ubuntu系统开机自启动方式
2019-05-01
ES查询效率之快的三个重要技术
2019-05-01
JDBC概念,JDBC连接到Oracle 11g(内附驱动jar包),
2019-05-01
彻底卸载MySQL
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
SQL命令分类(DDL、DML、DCL、TCL以及事务)
2019-05-01
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate 报错
2019-05-01
kafka集群搭建
2019-05-01
Python正则表达式,从入门到实战,精华都在这里!
2019-05-01
喜欢玩王者荣耀的有福了,用 Python 获取英雄皮肤壁纸
2019-05-01
一名数据分析师的SQL学习历程
2019-05-01