我正在使用 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 点而受到影响,好吗?