假设我们使用同一部相机,用不同视角拍了两张照片,那么如何对这两张图片视角变换进行建模,将相邻的两张图片联系起来,就成为了一个问题。
上图展示了一些几何变换。单应矩阵的作用在于,将图像平面P1转换为另一个图像平面P2。下面是一个例子:
上面的projective(射影变换)可以表示为:I1=H×I2
其中H即为单应矩阵。单应矩阵保持图像中的直线,因此,唯一可能的变换是平移、仿射等。H矩阵可以表示为:
h11 h12 h13
h21 h22 h23
h31 h32 h33
在图像拼接这一问题中,我们一旦获得了图像之间的匹配,下一步就是计算单应矩阵。单应矩阵将使用这些匹配的关键点估计图像之间的相对方向变换。
那么,对于全景拼接过程中两张图像相邻的情况,怎样计算单应矩阵呢?我们注意到,这涉及到RANSAC算法,在OpenCV中,调用findHomography()方法时指定cv2.RANSAC参数。
给定原始图像与目标图像,则相应的单应矩阵可以用OpenCV中的findHomography()方法求得。
# pts_src与pts_dst都是numpy arrays
h, status = cv2.findHomography(pts_src, pts_dst, cv2.RANSAC)
给定原始图像与单应矩阵,则转换后的图像可以用OpenCV中的warpPerspective()方法求得。
# im_src是numpy arrays
# size的格式:(width,height)
im_dst = cv2.warpPerspective(im_src, h, size)