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

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

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

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

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

java仿射变换_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)

三维透视变换类似

不过需要使用四个变换点的坐标计算变换矩阵

java仿射变换_opencv 几何变换 二维仿射变换和三维的透视变换_第3张图片

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)

转载至链接:https://my.oschina.net/ahaoboy/blog/1933938

你可能感兴趣的:(java仿射变换)