##投影变换## 在放射变换中,物体是在二维空间中变换的。如果物体在三维空间中发生了旋转,那么这种变换就成为投影变换,在投影变换中就会出现阴影或者遮挡,我们可以运用二维投影对三维投影变换进行模块化,来处理阴影或者遮挡。在OpenCV中有类似于getAffineTransform函数:getPerspectiveTransform(src,dst)函数 用来处理计算投影变换矩阵。与getAffineTransform函数不同的是传入的参数是三维空间坐标系的空间坐标,也就是4*2的二维ndarray,其中每一行代表一个坐标并且传入的数据类型必须为float32.示例:
import cv2
import numpy as np
src=np.array([[0,0],[100,0],[0,100],[100,100]],np.float32)
dst=np.array([[100,10],[100,10],[50,70],[200,150]],np.float32)
P=cv2.getPerspectiveTransform(src,dst)
print(P)
运行结果:
[[-7.77156117e-16 -1.00000000e+00 1.00000000e+02]
[-2.77555756e-15 -1.00000000e-01 1.00000000e+01]
[-2.66713734e-17 -1.00000000e-02 1.00000000e+00]]
由结果可以看出当前输出的类型是float64.对于仿射变换在OpenCV中提供了如下的函数 cv2.warpPerspective(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]]) 输入的矩阵类型是3行3列的投影变换矩阵。示例:
import cv2
import numpy as np
import matplotlib
def Perspect(path):
img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)
if not isinstance(img, np.ndarray):
print('PASS')
pass
else:
h,w=img.shape
#设置变换坐标变化
src=np.array([[0,0],[w-1,0],[0,h-1],[w-1,h-1]],np.float32)
dst=np.array([[100,100],[w/3,100],[100,h-1],[w-1,h-1]],np.float32)