最近做一个项目,需要自己生成图片数据。查了下需要用到仿射变换(Affine transformation)跟投射变换(perspective transformation)。折腾了一两天,把自己的心得记录一下,有些坑网上并没有找到答案。
首先是仿射变换,其实是将图形在2D平面内做变换,变换前后图片中原来平行的线仍会保持平行,可以想象是将长方形变换为平行四边形。细节问题我这里不说了,网上资料不少。先要调用opencv函数cv2.getAffineTransform来计算变换矩阵,然后利用变换矩阵将图片进行变换。
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[50, 50], [200, 50], [100, 200]])
#有了原始三个点和新的三个点坐标,便可以通过warpAffine
#函数计算出变换矩阵
#这个矩阵相当与讲坐标系进行了某种线性变换
M = cv2.getAffineTransform(pts1, pts2)
dst1 = cv2.warpAffine(img, M, (2*cols, 2*rows))
But, 这不是重点,我的需求是给定平面内一个点,计算变换后的点坐标。查看Opencv官方手册,发现公式(x_new, y_new).T = map_matrix*(x, y, 1).T
于是根据这个公式,进行编写就好了。
np.matrix(M)*np.matrix([50, 200, 1]).T
=