OpenCV projectPoints():估计姿势的协方差/标准偏差不一致

时间:2018-02-09 17:22:22

标签: opencv computer-vision pose-estimation

我在姿势估计算法中使用OpenCV,其中我也试图获得估计姿势的不确定性的估计。我的姿势估计是通过3D-2D对应和PNP算法来执行的。为了实现不确定性估计,我试图使用projectPoints()函数在图像平面上重新投影3D点,并使用内部计算的雅可比矩阵来获得协方差。

我的功能'地图'包含一组平面的3D点。我的相机轨迹很简单:我开始接近特征,向后移动,从而远离特征,然后再靠近,直到我到达起点。我正在使用3D模拟器(虚幻引擎)来获取这些图像,我有相机的正确内在函数(并且它没有失真)。我看到的问题是使用projectPoints()估计的协方差和随后的标准偏差(用于平移)与实际位置误差无关。当我向远处移动时,估计变得更糟,姿势不稳定,但标准偏差是减少。我附上估计姿势的距离误差图,相应地估计标准偏差图,并且它们具有相反的轮廓。我试图计算这个标准差的代码如下。

cv::Mat rvec, J;
cv::eigen2cv(pose.rotation(), rvec);
cv::Mat tvec = cv::Mat(1, 3, CV_32FC1, cv::Scalar::all(0));

tvec.at<float>(0, 0) = pose.center()[0];
tvec.at<float>(0, 1) = pose.center()[1];
tvec.at<float>(0, 2) = pose.center()[2];

cv::Mat p;
cv::projectPoints(objectPoints, rvec, tvec, K, dist, p, J);

std::vector <cv::Point2f> reprojected;

for (int i = 0; i < p.rows; i++) {
    reprojected.push_back(cv::Point2f(p.at<double>(i, 0), p.at<double>(i, 1)));
}
cv::Mat Sigma = cv::Mat(J.t() * J, cv::Rect(0, 0, 6, 6)).inv();
cv::Mat std_dev;
sqrt(Sigma.diag(), std_dev);

估计距离误差与地面实况的关系图;以及估计的标准差:

enter image description here

这可能是什么问题?据我所知,姿势变化与重投影误差变化之间的雅可比行星不能完全编码位置误差(例如,距离特征点很远的Z处的小变化不会改变重投影误差),但是如何在进行姿态估计时对我的解决方案质量进行一些可靠的估计?

0 个答案:

没有答案