我想使用 Matlab 自己编写 sfm 管道,因为我需要一些 opencv 函数不提供的输出。不过,我使用 opencv 进行比较。
Opencv 函数[E,mask] = cv.findEssentialMat(points1, points2, 'CameraMatrix',K, 'Method','Ransac');使用 Nister 的五点算法和 RANSAC 提供基本的矩阵解。
使用以下方法找到内点指数:InliersIndices=find(mask>0);
我使用了 Nister 算法的 Matlab 实现:
该函数的调用如下:
[E_all, R_all, t_all, Eo_all] = five_point_algorithm( pts1, pts2, K, K);
Run Code Online (Sandbox Code Playgroud)
该算法最多输出 10 个基本矩阵的解。但是,我遇到了以下问题:
InliersIndices,输出的基本矩阵(最多 10 个)都与 Opencv 返回的矩阵不同。我使用matlab工具箱的功能进行三角测量
投影矩阵:
P1=K*[eye(3) [0;0;0]];
P2=K*[R_all{i} t_all{i}];
[pts3D,rep_error] = triangulate(pts1', pts2', P1',P2');
Run Code Online (Sandbox Code Playgroud)
编辑
返回的E来自[E,mask] = cv.findEssentialMat(points1, points2, 'CameraMatrix',K, 'Method','Ransac');
E = …Run Code Online (Sandbox Code Playgroud)