opencv透视变换,提取特征图像

目录

基本介绍

cv2.getPerspectiveTransforms介绍

cv2.warpPerspective介绍

寻找特征图像

完整代码及运行效果 


基本介绍

        注意:这篇文章的前提是学过图像仿射变换

        使用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()

猜你喜欢

转载自blog.csdn.net/m0_51545690/article/details/123961645