多语言展示
当前在线:1355今日阅读:195今日分享:41

python环境opencv实现透视变化的方法

在学习opencv过程中,有时要碰到透视投影,就如同沿着人行道看向远方,显示较强的立体感。透视变换是一种改变对象尺寸和形状的操作,一个平面图形经透视变换后可产生立体效果。还好opencv提供了函数供懒人们调用。
工具/原料
1

opencv3 python3

2

pycharm windows7

方法/步骤
1

如同放射变化,透视变换提供了getPerspectiveTransform用来生成矩阵,然后通过warpPerspective实现转换。

2

还是以每瓶为例说明。import cv2  as cvimport  numpy as npimport copyimport osfrom matplotlib import pyplot as pltfrom skimage.measure import compare_ssimimport randomimage = cv.imread('c:\\meiping1.png')rows,cols,channel = image.shapeimage2 = copy.copy(image)

3

1)构建4个点的矩阵  ,注意:透视变换需要4个点 至少三个不共线。2)透视变换要3x3变换矩阵。 转换后直线是直线。3)变换矩阵,输入要4个点,输出图像上需要相应的点。picSrc = np.float32([[0,0],[cols,0],[0,rows],[cols,rows]])picDst = np.float32([[0,0],[cols, int(0.2*rows)],[0,rows],[cols,int(0.8*rows)]])M = cv.getPerspectiveTransform(picSrc, picDst)imageResult = cv.warpPerspective(image, M,(cols,rows))plt.subplot(121)plt.imshow(image)plt.title('image')plt.subplot(122)plt.imshow(imageResult)plt.title('imageResult')plt.show()

4

再拉一组类似星球大战开场梯形。picSrc = np.float32([[0,0],[cols,0],[0,rows],[cols,rows]])picDst = np.float32([[int(0.2*cols),0],[int(0.8*cols), 0],[0,rows],[cols,rows]])M1 = cv.getPerspectiveTransform(picSrc, picDst)imageResult1 = cv.warpPerspective(image, M1,(cols,rows))cv.imshow('imageResult1', imageResult1)cv.waitKey(0)

6

小结:通过调整 第二个矩阵4个坐标点就可以实现转换矩阵的变化,求出转换矩阵后使用cv.warpPerspective对原图进行转换。要注意4个点不共线

注意事项
1

要四个点才行

2

通过调整目标矩阵的输出点坐标,就可轻易实现转换矩阵的获得,然后进行投影即可。

推荐信息