如何结合PnP、ICP和直接法的非线性方法?

如何解决如何结合PnP、ICP和直接法的非线性方法?

我目前正在研究一些视觉里程计算法,我发现在解决 PnP 和 ICP 等问题时​​有非线性和线性方法,而直接方法可以最大限度地减少两点之间的强度误差。上述非线性方法也将重投影误差的两点之间的误差最小化。

我可以使用高斯-牛顿方法实现 PnP、ICP 和直接方法求解,因为它们的实现仅在雅可比矩阵和误差函数上有所不同,我想问有没有办法最小化三个误差函数并将它们组合在一起?例如opencv库在“opencv_contrib/odometry.cpp”中结合了ICP和直接方法,我贴在下面,但是我不太明白“calcRgbdLsmMatrices”函数中的原理,有没有其他方法可以将三个结合起来他们使用非线性方法

提前感谢您的帮助!!

for(int iter = 0; iter < iterCounts[level]; iter ++) 
        {
            Mat resultRt_inv = resultRt.inv(DECOMP_SVD);
            if(method & RGBD_odoMETRY)
                computeCorresps(levelCameraMatrix,levelCameraMatrix_inv,resultRt_inv,srcLevelDepth,srcFrame->pyramidMask[level],dstLevelDepth,dstFrame->pyramidTexturedMask[level],maxDepthDiff,corresps_rgbd);

            if(method & ICP_odoMETRY)
                computeCorresps(levelCameraMatrix,dstFrame->pyramidnormalsMask[level],corresps_icp);
            if(corresps_rgbd.rows < minCorrespsCount && corresps_icp.rows < minCorrespsCount)
                break;

            Mat AtA(transformDim,transformDim,CV_64FC1,Scalar(0)),AtB(transformDim,1,Scalar(0));
            if(corresps_rgbd.rows >= minCorrespsCount) // 120
            {
                calcRgbdLsmMatrices(srcFrame->pyramidImage[level],srcFrame->pyramidCloud[level],resultRt,dstFrame->pyramidImage[level],dstFrame->pyramid_dI_dx[level],dstFrame->pyramid_dI_dy[level],corresps_rgbd,fx,fy,sobelScale,AtA_rgbd,AtB_rgbd,rgbdEquationFuncPtr,transformDim);

                AtA += AtA_rgbd;
                AtB += AtB_rgbd;
            }
            if(corresps_icp.rows >= minCorrespsCount)
            {
                calcICPLsmMatrices(srcFrame->pyramidCloud[level],dstFrame->pyramidCloud[level],dstFrame->pyramidnormals[level],corresps_icp,AtA_icp,AtB_icp,icpEquationFuncPtr,transformDim);
                AtA += AtA_icp;
                AtB += AtB_icp;
            }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?