1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 透视变换原理和变换矩阵的python实现

透视变换原理和变换矩阵的python实现

时间:2020-08-05 08:27:18

相关推荐

透视变换原理和变换矩阵的python实现

透视变换又叫投影变换,我们常说的仿射变换是透视变换的一个特例。透视变换的目的就是把现实中为直线的物体,在图片上可能呈现为斜线,通过透视变换转换成直线的变换。

透视变换矩阵:

透视变换矩阵warpMatric,(下图使用的A表示,下面代码该矩阵用warpMatrix表示,A表示8*8的矩阵)

透视变换的源点和目标点,矩阵如下:

源点矩阵:目标点矩阵:

这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以Z, (X';Y';Z')表示图像上的点:

令,展开上面公式,得到一个点的情况:

4个点可以得到8个方程,求解8个未知数,即可解出透视变换矩阵warpMatric:

其中的x,y是源点的四个坐标,X',Y’表示目标点的四个坐标。

假设:

源点四个坐标分别为A:(x0,y0),(x1,y1),(x2,y2),(x3,y3)

目标点四个坐标分别为B:(X'0,Y'0),(X'1,Y'1),(X'2,Y'2),(X'3,Y'3)

其中的A和B是已知,所以就可以求出warpMatrix。

下面是上面透视变换矩阵的python实现:

import numpy as npdef WarpPerspectiveMatrix(src, dst):assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4nums = src.shape[0]A = np.zeros((2*nums, 8)) # A*warpMatrix=BB = np.zeros((2*nums, 1))for i in range(0, nums):A_i = src[i,:]B_i = dst[i,:]A[2*i, :] = [ A_i[0], A_i[1], 1, 0,0, 0,-A_i[0]*B_i[0], -A_i[1]*B_i[0]]B[2*i] = B_i[0]A[2*i+1, :] = [0,0, 0,A_i[0], A_i[1], 1,-A_i[0]*B_i[1], -A_i[1]*B_i[1]]B[2*i+1] = B_i[1]A = np.mat(A)warpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32#之后为结果的后处理warpMatrix = np.array(warpMatrix).T[0]warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1warpMatrix = warpMatrix.reshape((3, 3))return warpMatrixif __name__ == '__main__':print('hello world!')src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]]src = np.array(src)dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]]dst = np.array(dst)warpMatrix = WarpPerspectiveMatrix(src, dst)print(warpMatrix)

输出结果:

参考:/cuixing001/article/details/80261189

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。