opencv 几何变换 二维仿射变换和三维的透视变换

原文链接: opencv 几何变换 二维仿射变换和三维的透视变换

上一篇: opencv 直方图匹配 图片颜色迁移

下一篇: c++ 输入输出流重定向

二维仿射变换,相当于将二维平面上的每个坐标点与一个2X3的矩阵相乘,得到新的坐标,而透视变换则是与3X3的矩阵相乘,原本平行的两条直线在经过仿射变换后依然平行,但经过透视变化之后,可能不再平行。

opencv 几何变换 二维仿射变换和三维的透视变换_第1张图片

仿射变换有6个参数,因此只需要指定变换前后3个坐标点的坐标,就可以通过解线性方程组获得变换矩阵。可以使用getAffineTransform(src,dst)来快速完成计算,src和dst参数是变换前后三个点的坐标,他们都是形状为(3,2)的单精度浮点数数组。

src为三角形三个顶点坐标,三个点分别为三个顶点,dst为三个顶点仿射变化后的坐标,使用getAffineTransform得到变换矩阵,然后使用warpAffine进行仿射变化

opencv 几何变换 二维仿射变换和三维的透视变换_第2张图片

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)

你可能感兴趣的:(opencv,计算机视觉,numpy,cv,shader)