一、原理讲解
照相机等设备在处理图像时,因为拍摄角度等原因造成图像拉伸扭曲。为了解决这一问题,透视变换矩阵孕育而生。
在opencv中拥有获取该矩阵的函数cv2.getPerspectiveTransform(src, dst),与进行透视变换的函数
def getPerspectiveTransform(src: cv2.typing.MatLike,
dst: cv2.typing.MatLike,
solveMethod: int = ...) \
-> cv2.typing.MatLike: ...
功能:cv2.getPerspectiveTransform(src, dst)
参数:
src: 源图像中的四个点,通常是一个形状为 (4, 2) 的 numpy 数组或类似的数据结构,表示四个点的坐标。这四个点应该按照某种顺序排列(例如,顺时针或逆时针),因为变换矩阵的计算依赖于这个顺序。
dst: 目标图像中的四个点,与 src 参数类似,也是一个形状为 (4, 2) 的 numpy 数组或类似的数据结构,表示变换后四个点应该位于的位置。
函数返回一个 3x3 的变换矩阵,可以使用 cv2.warpPerspective() 函数将这个矩阵应用于图像,从而执行透视变换。
通过opencv我将对下面图片中的油画进行透视矫正
二、代码展示
import cv2
import numpy as np
# 读取一张图片
img = cv2.imread("./04.png")
# 获取透视矩阵
# 2-1找到原图中的四个点
points1=np.float32([[175,142],[621,35],[89,491],[652,546]])
# 2-2设置原图中的四个点再目标途中的四个位子
points2 = np.float32([[min(points1[:,0]),min(points1[:,1])],
[max(points1[:,0]),min(points1[:,1])],
[min(points1[:,0]),max(points1[:,1])],
[max(points1[:,0]),max(points1[:,1])]
])
# 2-3获取矩阵
M = cv2.getPerspectiveTransform(points1,points2)
# 3、进行透视变换
img_perspective = cv2.warpPerspective(img,M,(img.shape[1],img.shape[0]))
cv2.imshow('img',img)
cv2.imshow('img_p',img_perspective)
cv2.waitKey(0)
cv2.imshow('img',img)
cv2.waitKey(0)
三、实验现象