原文链接: opencv 几何变换 二维仿射变换和三维的透视变换
上一篇: opencv 直方图匹配 图片颜色迁移
下一篇: c++ 输入输出流重定向
二维仿射变换,相当于将二维平面上的每个坐标点与一个2X3的矩阵相乘,得到新的坐标,而透视变换则是与3X3的矩阵相乘,原本平行的两条直线在经过仿射变换后依然平行,但经过透视变化之后,可能不再平行。
仿射变换有6个参数,因此只需要指定变换前后3个坐标点的坐标,就可以通过解线性方程组获得变换矩阵。可以使用getAffineTransform(src,dst)来快速完成计算,src和dst参数是变换前后三个点的坐标,他们都是形状为(3,2)的单精度浮点数数组。
src为三角形三个顶点坐标,三个点分别为三个顶点,dst为三个顶点仿射变化后的坐标,使用getAffineTransform得到变换矩阵,然后使用warpAffine进行仿射变化
import cv2 as cv
import numpy as np
img = cv.imread('lena.jpg')
cv.imshow('img', img)
h, w = img.shape[:2]
src = np.array([[0, 0], [w - 1, 0], [0, h - 1]], dtype=np.float32)
dst = np.array([[300, 300], [800, 100], [100, 600]], dtype=np.float32)
m = cv.getAffineTransform(src, dst)
# 使用m矩阵变换,结果为两倍图像大小,使用白色填充
res = cv.warpAffine(
img,
m,
(2 * w, 2 * h),
borderValue=(255, 255, 255, 255)
)
cv.imshow('res', res)
cv.waitKey(0)
三维透视变换类似
不过需要使用四个变换点的坐标计算变换矩阵
import cv2 as cv
import numpy as np
img = cv.imread('lena.jpg')
cv.imshow('img', img)
h, w = img.shape[:2]
src = np.array([[0, 0], [w - 1, 0], [w - 1, h - 1], [0, h - 1]], dtype=np.float32)
dst = np.array([[300, 300], [800, 100], [900, 900], [100, 600]], dtype=np.float32)
m = cv.getPerspectiveTransform(src, dst)
# 使用m矩阵变换,结果为两倍图像大小,使用白色填充
res = cv.warpPerspective(
img,
m,
(2 * w, 2 * h),
borderValue=(255, 255, 255, 255)
)
cv.imshow('res', res)
cv.waitKey(0)