0

我正在使用 OpenCV 三角测量函数对 3D 点进行三角测量,该函数有时可以正常工作,但我注意到当两个相机姿势彼此靠近时,三角测量点很远。我可以理解这个问题,因为相机姿势很近,所以来自两个相机的光线相交发生在远离相机的地方。这就是它在远处创建 3D 点的原因。我还注意到,两个摄像机之间正确三角测量的距离要求在不同情况下会有所不同。目前我正在尝试找到两个姿势之间的视差,如果高于某个阈值(我选择了 27)然后继续进行三角测量,但我确实这样做了在所有情况下看起来都不正确。

我计算视差的代码如下 -

float checkAvgParallex(SE3& prevPose, SE3& currPose, std::vector<Point2f>& prevPoints, std::vector<Point2f>& currPoints, Mat& K) {
    Eigen::Matrix3d relRot = Eigen::Matrix3d::Identity();
    Eigen::Matrix3d prevRot = prevPose.rotationMatrix();
    Eigen::Matrix3d currRot = currPose.rotationMatrix();
    relRot = prevRot * currRot;
    float avg_parallax = 0.;
    int nbparallax = 0;

    std::set<float> set_parallax;

    bearingVectors_t prevBVs;
    bearingVectors_t currBVs;

    points2bearings(prevPoints, K, prevBVs);
    points2bearings(currPoints, K, currBVs);

    for (int i = 0; i < prevPoints.size(); i++) {
        Point2f unpx = projectCamToImage(relRot * currBVs[i], K);
        float parallax = cv::norm(unpx - prevPoints[i]);
        avg_parallax += parallax;
        nbparallax++;
        set_parallax.insert(parallax);
    }
    if (nbparallax == 0)
        return 0.0;
    avg_parallax /= nbparallax;

    auto it = set_parallax.begin();
    std::advance(it, set_parallax.size() / 2);
    avg_parallax = *it;

    return avg_parallax;
}

有时当相机之间的视差不超过 27 时,三角测量将不起作用,因此我在 SLAM 系统中的进一步姿势计算由于缺少 3D 点而停止。

那么任何人都可以建议我使用替代策略来估计正确的 3D 点并且我的 SLAM 系统不会因缺少 3D 点而受到影响,好吗?

4

0 回答 0