目录
cv2.getPerspectiveTransforms介绍
基本介绍
注意:这篇文章的前提是学过图像仿射变换
使用opencv的透视变换可以使我们简单的提取想要的信息,只需要知道原图像的4个点,通过这4个点以及想要生成的图像坐标,我们就能算出M矩阵,然后通过cv.warpPerspective方法就可以提取出图片。
先来看看效果,下面使用该技术将图片中的书提取出来
cv2.getPerspectiveTransforms介绍
上面我们知道要通过4个原本图像中的坐标,还有新生成图像的坐标,通过运算得到M矩阵,手算太麻烦了,我们使用opencv提供的函数来完成,这个函数返回M矩阵
def getPerspectiveTransform(src, dst, solveMethod=None)
- src:原图像上的4个点坐标
- dst:生成图像的4个点坐标
- solveMethod:矩阵分解方法,传递给cv2.solve(DecompTypes) 求解线性方程组或解决最小二乘问题,默认值为None,表示使用DECOMP_LU。详情参考官网
下面给出大致示意图。
cv2.warpPerspective介绍
这个方法和warpPerspective特别相似,下面给出解释
def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
- src:输入图像
- M:运算矩阵
- dsize:运算后矩阵的大小,也就是输出图片的尺寸
- dst:输出图像
- flags:插值方法的组合,与resize函数中的插值一样,可以查看cv2.resize
- borderMode:像素外推方法,详情参考官网
- borderValue:在恒定边框的情况下使用的borderValue值;默认情况下,它是 0
寻找特征图像
通过matplotlib输出图像,然后大致观察下特征图像的4个坐标
我这里通过观察给出左上,右上,左下,右下4个坐标,(190, 240), (505, 160), (360, 670), (768, 490)
src = np.float32([[190, 240], [505, 160], [360, 670], [768, 490]])
我们得到了特征图像的4个坐标,然后再给出新生成图像的4个坐标即可,我要生成的是高640,宽480的图像,所以新生成的左上,右上,左下,右下4个坐标为(0, 0), (480, 0), (0, 640), (480, 640)
dst = np.float32([[0, 0], [480, 0], [0, 640], [480, 640]])
完整代码及运行效果
import cv2
import numpy as np
img = cv2.imread('../images/book.jpg')
# 设置特征图像和生成图像的坐标
src = np.float32([[190, 240], [505, 160], [360, 670], [768, 490]])
dst = np.float32([[0, 0], [480, 0], [0, 640], [480, 640]])
# 通过运算得出M矩阵
M = cv2.getPerspectiveTransform(src, dst)
# 提取特征图片
book = cv2.warpPerspective(img, M, (480, 640))
cv2.imshow('img', cv2.resize(img, (480, 640)))
cv2.imshow('book', book)
cv2.waitKey(0)
cv2.destroyAllWindows()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140276.html