关于透视变换的映射关系

OpenCV提供了一些关于透视变换的接口,例如getPerpectiveTransform, warpPerspective等。这里主要说明一下warpPerspective是如何工作的。

其实OpenCV中很多图像变换的映射关系都是反直觉的,如这里的warpPerspective和remap函数。直觉告诉我们,这些函数的输入是原图的像素坐标,通过映射表或矩阵运算,输出的是目标图像的像素坐标。其实不然,OpenCV是先取一个目标图像的坐标,然后根据映射关系定位到原图中去,再从原图中得到该坐标的像素值。然而通过映射关系得到的坐标通常不是一个整数,即并不是原图的一个像素坐标,所以还需根据原图中该坐标周围的像素值用某些插值算法计算出该坐标应有的像素值。也就是:

映射关系

对于warpPerspective这个函数,我们已知它表示的映射关系了:

warpPerspective map

特别提醒,公式里的x,y是目标图像的坐标!那么我们设原图坐标是xo,yo,则有:

\[x_o=\]

xo=(M11x+M12y+M13)/(M31x+M32y+M33)

yo=(M21x+M22y+M23)/(M31x+M32y+M33)

当我们想计算原图中某个特定的点在目标图像中的位置时,就需要解这个二元一次方程组了,解得:

x=((M22-M32yo)(M33xo-M13)-(M12-M32xo)(M33yo-M23))/((M22-M32yo)(M11-M31xo)-(M12-M32xo)(M21-M31yo))

y=((M21-M31yo)(M33xo-M13)-(M11-M31xo)(M33yo-M23))/((M21-M31yo)(M12-M32xo)-(M11-M31xo)(M22-M32yo))

 

推荐阅读:

http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#warpperspective

posted @ 2016-12-06 17:35  zipeilu  阅读(2479)  评论(0编辑  收藏  举报