快捷搜索: 王者荣耀 脱发

FindFundamentalMat(python)函数解析——三维视觉

最近在入门三维视觉,在SFM算法的代码中看到了这个函数,没有找到满意的帖子,所以打算自己总结一下。

原理层面

什么是Fundamental Matrix?

基础矩阵(Fundamental Matrix,F)表达点到直线的关系。在对极几何中,就是左视图上一点x1到右视图上极线L2的关系,如下公式: L2=Fx1 根据对极几何原理,左视图上一点x1*在右视图上的匹配点 x2 一定在极线L2上,也就是:x2TL2= x2TFx1=0 给定一组匹配好的特征点集 x1和 x2 ,计算其基础矩阵过程包括以下四步:

    坐标归一化 Normalize coordinates 随机选择8对匹配特征点进行基础矩阵估计 Compute F21 检查基础矩阵精度 CheckFundamental 重复步骤2和步骤3

什么是Essential Matrix?

本质矩阵就是在归一化图像坐标下的基本矩阵。不仅具有基本矩阵的所有性质,而且还可以估计两相机的相对位置关系,具体内容可参考《计算机视觉中的多视图几何》。PS:强力推荐这本书!已经被好多博主安利了,过几天就到图书馆借本来康康。

代码

cv2.findFundamentalMat

函数功能:从两个图像中的对应点计算基本矩阵。

函数输入/返回值: Python: cv2.findFundamentalMat(points1, points2, method, param1, param2, status) → retval, mask 这个返回的mask是干啥的? Parameters: points1 – 包含第一张图像的 N 个点的数组。. points2 – 与 points1 具有相同大小和格式的第二个图像点的数组。 method – 计算基本矩阵的方法。 CV_FM_7POINT for a 7-point algorithm. N = 7 CV_FM_8POINT for an 8-point algorithm. N>=8 CV_FM_RANSAC for the RANSAC algorithm. N>=8 CV_FM_LMEDS for the LMedS algorithm. N>=8 param1 – 用于 RANSAC 的参数。 它是从一个点到一条以像素为单位的对极线的最大距离,超过该距离的点被认为是异常值,不用于计算最终的基本矩阵。 它可以设置为 1-3 之类的值,具体取决于点定位的准确性、图像分辨率和图像噪声。 param2 –仅用于 RANSAC 或 LMedS 方法的参数。 它指定了估计矩阵正确的理想置信水平(概率)。 mask – 输出包含 N 个元素的数组,其中的每个元素对于异常值都设置为 0,对于其他点设置为 1。 该数组仅在 RANSAC 和 LMedS 方法中计算。 对于其他方法,它设置为全 1。

#eg
F, mask = cv2.findFundamentalMat(pixel_points1, pixel_points2, method=cv2.FM_RANSAC,ransacReprojThreshold=0.9, confidence=0.99)

具体可参考:

经验分享 程序员 微信小程序 职场和发展