单应矩阵求解推导过程

单应矩阵的定义是一个平面到另一个平面的映射

如上图所示,O1与O2时相机不同位姿下两个相机坐标系的原点,R和T分别表示两个坐标系之间的旋转和平移矩阵,平面p上的一点在两个坐标系下的的坐标为X1和X2,投影到像素坐标分别为x1和x2。设平面p的法向量为n,并且p到坐标系O1的距离为d,则p可以表示为

将这个式子变换为

与此同时,X1与X2的关系可以表示为

将上述两个式子合并表示成

设两个相机坐标系的单应矩阵为H’,则H’可以表示为

结合上述两个式子,则

为了得到单应矩阵H',我们需要将X1和X2转换到像素坐标系中,设K为相机的内参数矩阵,则

将(7)代入(4),得

由于单应矩阵为3x3矩阵,具有尺度不变性,设尺度因子为α,则(8)的归一化表达式为

将(9)展开得

将(12)与(10)和(11)结合得

因为单应矩阵得自由度为8,因此只需要四对匹配点就可以求解相机的单应矩阵,然而由于图像中存在许多动态特征点和噪声点,求解的单应矩阵鲁棒性较差。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单应矩阵是指在计算机视觉中用于图像处理的一种变换矩阵。在Python中,我们可以使用OpenCV库来计算单应矩阵。 首先,我们需要导入OpenCV库: ```python import cv2 import numpy as np ``` 然后,我们可以读取两张图片并提取特征点: ```python img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 使用SIFT算法提取特征点 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) ``` 接下来,我们可以使用FLANN算法来匹配两张图片的特征点: ```python # 创建FLANN匹配器 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 在两张图片的特征点中进行匹配 matches = flann.knnMatch(des1,des2,k=2) ``` 然后,我们需要筛选出匹配点对: ```python good_matches = [] for m,n in matches: if m.distance < 0.7*n.distance: good_matches.append(m) # 获取匹配点对的坐标 pts1 = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1,1,2) pts2 = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1,1,2) ``` 最后,我们可以使用cv2.findHomography()函数来计算单应矩阵: ```python # 计算单应矩阵 H, mask = cv2.findHomography(pts1, pts2, cv2.RANSAC,5.0) # 输出单应矩阵 print(H) ``` 这样,我们就可以得到两张图片之间的单应矩阵了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值