基础矩阵求解之RANSAC、8点算法(python)

本文介绍如何处理多个视图,求解不同图像对基础矩阵。通过在不同视点拍摄的图像,我们可以利用特征匹配来计算出三维场景点以及照相机位置。特征匹配在前几篇文章中讲过,可用SIFT算子或Harris角点检测,但相比之下sift效果更好,本文选择sift算法进行特征匹配。接下来我们介绍基础矩阵。
两幅视图存在两个关系:第一种,通过对极几何一幅图像上的点可以确定另外一幅图像上的一条直线;另外一种,通过上一种映射,一幅图像上的点可以确定另外一幅图像上的一个点,这个点是第一幅图像通过光心和图像点的射线与一个平面的交点在第二幅图像上的影像。第一种情况可以用基础矩阵来表示,第二种情况则用单应矩阵来表示。而本质矩阵则是基本矩阵的一种特殊情况,是在归一化图像坐标下的基本矩阵

基础矩阵(Fundamental Matrix)

基本矩阵体现了两视图几何(对极几何,epipolar geometry)的内在射影几何(projective geometry)关系,基本矩阵只依赖于摄像机的内部参数K和外部参数R、t
在这里插入图片描述
上图是一个两视图的几何描述,其中C、C’是两个相机的光心,两点连线CC’称为基线,基线与图像平面的交点e、′e′称为对极点,其中l′是图像点x对应的对极线

  • 9
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
单应矩阵是指在计算机视觉中用于图像处理的一种变换矩阵。在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) ``` 这样,我们就可以得到两张图片之间的单应矩阵了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值