目录
基本介绍
cv2.getPerspectiveTransforms介绍
cv2.warpPerspective介绍
寻找特征图像
完整代码及运行效果
注意:这篇文章的前提是学过图像仿射变换
使用opencv的透视变换可以使我们简单的提取想要的信息,只需要知道原图像的4个点,通过这4个点以及想要生成的图像坐标,我们就能算出M矩阵,然后通过cv.warpPerspective方法就可以提取出图片。
先来看看效果,下面使用该技术将图片中的书提取出来
上面我们知道要通过4个原本图像中的坐标,还有新生成图像的坐标,通过运算得到M矩阵,手算太麻烦了,我们使用opencv提供的函数来完成,这个函数返回M矩阵
def getPerspectiveTransform(src, dst, solveMethod=None)
下面给出大致示意图。
这个方法和warpPerspective特别相似,下面给出解释
def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
通过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()