我正在尝试使用单眼ORB SLAM2查找从相机到ORB特征点的真实世界距离。

我计算了每个ORB特征点的世界坐标与当前关键帧相机位置的世界坐标之间的欧式距离。对所有帧重复此过程。因此,可以获得当前帧中每个ORB点的距离。

在Viewer.cc中

std::vector<MapPoint*> MP = mpTracker->mCurrentFrame.mvpMapPoints;
cv::Mat CC = mpTracker->mCurrentFrame.GetCameraCenter();
mpFrameDrawer->DrawFrame(MP,CC);

在FrameDrawer.cc中
cv::Mat FrameDrawer::DrawFrame(std::vector<MapPoint*> DistMapPt, cv::Mat CameraPt)
{
   .
   .
   .

    else if(state==Tracking::OK) //TRACKING
    {
        mnTracked=0;
        mnTrackedVO=0;
        const float r = 5;

        for(int i=0;i<n;i++)
        {
            if(vbVO[i] || vbMap[i])
            {
                cv::Point2f pt1,pt2;
                pt1.x=vCurrentKeys[i].pt.x-r;
                pt1.y=vCurrentKeys[i].pt.y-r;
                pt2.x=vCurrentKeys[i].pt.x+r;
                pt2.y=vCurrentKeys[i].pt.y+r;

                float MapPointDist;
                 MapPointDist = sqrt(pow((DistMapPt[i]->GetWorldPos().at<float>(0)-CameraPt.at<float>(0)),2)+pow((DistMapPt[i]->GetWorldPos().at<float>(1)-CameraPt.at<float>(1)),2)+pow((DistMapPt[i]->GetWorldPos().at<float>(2)-CameraPt.at<float>(2)),2));

                }
   .
   .
   .

            }


        }
    }

计算出的距离既不等于也不可以缩放为实际距离。相同的方法在RGBD ORB SLAM2中给出相对准确的距离。

有什么方法可以缩放单眼ORB SLAM中的距离?

最佳答案

请查看此post:“ORB-SLAM2在初始化时任意定义比例,作为中间场景深度。实际上,每次初始化orb-slam2时比例都是不同的。”在单眼SLAM中无法获得正确的比例,因为您无法从图像序列估计现实世界的深度。您需要另一个数据源,例如第二台摄像机,IMU,激光雷达,机器人里程表或具有已知实际尺寸的标记。在RGBD情况下,可通过深度传感器知道深度,因此可以正确缩放坐标。

关于c++ - 是否可以在单眼ORB-SLAM2中获得距离缩放?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57214198/

10-11 23:03