我想使用Matlab编写自己的sfm管道代码,因为我需要一些opencv函数不提供的输出.但是,我使用opencv进行比较.
Opencv函数[E,mask] = cv.findEssentialMat(points1,points2,’CameraMatrix’,K,’Method’,’Ransac’);使用Nister的五点算法和RANSAC提供基本矩阵解决方案.
使用以下内容找到inlier指数:InliersIndices = find(mask> 0);
我使用了Nister算法的Matlab实现:
对函数的调用如下:
[E_all, R_all, t_all, Eo_all] = five_point_algorithm( pts1, pts2, K, K);
该算法输出多达10个基本矩阵的解.但是,我遇到了以下问题:
>上面提到的impelmentation仅用于完美对应(没有Ransac),并且我使用InliersIndices为算法5提供对应,输出的基本矩阵(最多10个)都不同于Opencv返回的矩阵.
>所有返回的基本矩阵应该是解决方案,那么为什么当我使用以下函数对每个矩阵进行三角测量时,我不会获得相同的3D点?
>如何选择合适的基本marix解决方案?
我使用matlab工具箱的功能进行三角测量
投影矩阵:
P1=K*[eye(3) [0;0;0]];
P2=K*[R_all{i} t_all{i}];
[pts3D,rep_error] = triangulate(pts1', pts2', P1',P2');
编辑
从[E,mask]返回的E = cv.findEssentialMa