几何变换之透视---OpenCV-Python开发指南(13)

举报
择城终老 发表于 2021/07/26 23:29:22 2021/07/26
【摘要】 目录 更复杂的仿射变化透视 更复杂的仿射变化 上篇博文讲解了2种最基本的仿射变换:平移与旋转。但OpenCV还给我们提供了函数cv2.getAffineTransform()来生成仿射函数cv2.warpAffine()所使用的转换矩阵M。 该函数的定义如下: def getAffineTransform(src, dst): 1 src:代表输...

更复杂的仿射变化

上篇博文讲解了2种最基本的仿射变换:平移与旋转。但OpenCV还给我们提供了函数cv2.getAffineTransform()来生成仿射函数cv2.warpAffine()所使用的转换矩阵M。

该函数的定义如下:

def getAffineTransform(src, dst): 

  
 
  • 1

src:代表输入图像的三个点坐标

dst:代表输出图像的三个点坐标

用过PS的都知道,我们在PS中使用快捷键Ctrl+T就可以随意拉扯图像,因为图像上下左右各有四个点负责定位。而src中的3个坐标与PS完全一致,分别为左上角,右上角,左下角,只是少了一个点,但定位绰绰有余,当然映射后只能是平行四边形,因为缺失一个坐标。

下面,我们来随意定位图像,并实现拉扯效果:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows,cols,ch = img.shape
p1=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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行之后,效果如下图所示:
变换图像
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):

  
 
  • 1

src:要透视的原始图像

M:变换透视图像的3*3变换矩阵

dsize:代表输出图像的尺寸大小

flags,borderMode,borderValue三个参数与前文类似这里不多做介绍。

下面,我们将上面的图像变换成任意四边形,具体代码如下所示:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
p1 = 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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

透视函数warpPerspective通过getPerspectiveTransform获得变换矩阵。运行之后,效果如下所示:
透视

文章来源: liyuanjinglyj.blog.csdn.net,作者:李元静,版权归原作者所有,如需转载,请联系作者。

原文链接:liyuanjinglyj.blog.csdn.net/article/details/113802729

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。