Homography 单应性
单应性矩阵是投影几何中一个术语,本质上它是一个数学概念,但是在OpenCV中却是有几个函数与透视变换相关的函数,都用到了单应性矩阵的概念与知识。
要计算两个图像之间的单应性,我们需要知道两个图像之间的至少4个点对应关系。如果我们有4个以上的对应点,那就更好了。OpenCV将可靠地估计最适合所有对应点的单应性。通常,这些点的对应关系是通过在图像之间匹配SIFT或SURF之类的功能自动找到的,但是在本文中,我们只是要手动选择这些点。(opencv有sift算法的封装,没用主要是因为环境我一直没配好……)
import cv2
import numpy as np
if __name__ == '__main__' :
# Read source image.
im_src = cv2.imread('book2.jpg')
# Four corners of the book in source image
pts_src = np.array([[141, 131], [480, 159], [493, 630],[64, 601]], dtype=float)
# Read destination image.
im_dst = cv2.imread('book1.jpg')
# Four corners of the book in destination image.确定目的图像上的四个点。
pts_dst = np.array([[318, 256],[534, 372],[316, 670],[73, 473]], dtype=float)
cv2.findHomography
计算多个二维点对之间的最优单映射变换矩阵,找到并返回源平面和目标平面之间的转换矩阵H,以便于反向投影错误率达到最小。
这个函数里面集成了四个算法
- 0 - 利用所有点的常规方法
- RANSAC - RANSAC-基于RANSAC的鲁棒算法
- LMEDS - 最小中值鲁棒算法
- RHO - PROSAC-基于PROSAC的鲁棒算法
其实四个算法差别在低运算的差别不大。
# Calculate Homography 找到两个平面之间的转换矩阵。
h, status = cv2.findHomography(pts_src, pts_dst)
cv2.warpPerspective
透视投影是为了获得接近真实三维物体的视觉效果而在二维的纸或者画布平面上绘图或者彩现的一种方法,它也称为透视图。透视投影的绘制必须根据已有的几何规则进行。
透视变换详细解释
# Warp source image to destination based on homography
im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))
# Display images
cv2.imshow("Source Image", im_src)
cv2.imshow("Destination Image", im_dst)
cv2.imshow("Warped Source Image", im_out)
cv2.waitKey(0)
左:Destination Image 右:Source Image
仿射变换后的源图像 Warped Source Image