opencv solvePnP,所有轴看起来都不错,除了 Y

Posted

技术标签:

【中文标题】opencv solvePnP,所有轴看起来都不错,除了 Y【英文标题】:opencv solvePnP, all axes look great except Y 【发布时间】:2019-01-06 23:16:09 【问题描述】:

我在图像数据集上运行 solvePnPRansac,其中包含 2d 特征点和三角化 3d 地标点。它运行良好,旋转、前轴和侧轴的结果看起来很棒。但是 Y 轴是完全错误的。

我正在根据数据集的基本事实测试输出,它在应该下降的地方上升,并且很快偏离基本事实。其他轴保持锁定的时间要长得多。

这让我觉得很奇怪,它怎么可能对其他轴是正确的,而对一个轴却是错误的?当然这是不可能的,我会认为要么每个轴都不好,要么每个轴都很好。

我可能做错了什么才能做到这一点?我该如何调试这种怪异之处?我的 PnP 代码很标准:

  cv::Mat inliers;
    cv::Mat rvec = cv::Mat::zeros(3, 1, CV_64FC1);      

    int iterationsCount = 500;        // number of Ransac iterations.
    float reprojectionError = 2.0; //2.0   // maximum allowed distance to consider it an inlier.
    float confidence = 0.95;          // RANSAC successful confidence.
    bool useExtrinsicGuess = false;
    int flags = cv::SOLVEPNP_ITERATIVE;

    int num_inliers_;
    //points3D_t0
    cv::solvePnPRansac(points3D_t0, points_left_t1, intrinsic_matrix, distCoeffs, rvec, translation_stereo,
        useExtrinsicGuess, iterationsCount, reprojectionError, confidence,
        inliers, flags);

【问题讨论】:

如果有帮助,我的行为几乎相同。一个问题:您使用的数据集是运动主要是平面的(例如汽车)还是在 y 上变化很大(例如无人机)? 嗨!这是一辆车。从这里:cvlibs.net/datasets/kitti/eval_odometry.php 我尝试了各种 pnp 设置,但我看到了同样的情况。您知道是什么原因造成的吗? 我尝试进行了一些调查,但无法提出明确的问题。我有一个疑问来自我们执行的运动类型,主要是平面运动可能会隐藏垂直轴上的可观察性。还要注意,在时间 t 的俯仰角估计中的一个小错误将对后续帧中的整个轨迹估计产生负面影响,即使没有执行 y 上的运动。 【参考方案1】:

我在无人机拍摄的图像中遇到了类似的问题——有时 Y 值(相机视线轴——在我的例子中是高度轴)低于地面。如果您考虑一下-对于平面视图(或靠近飞机)-有两种可能的“y”解决方案:在飞机之前和远离飞机(在我的情况下是地下和地下)。所以两者都是合法的解决方案。

【讨论】:

以上是关于opencv solvePnP,所有轴看起来都不错,除了 Y的主要内容,如果未能解决你的问题,请参考以下文章

opencv solvepnp函数各种方法比较

相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试

使用 SolvePnP 在 openCV 中的旋转和平移顺序问题

使用 OpenCV SolvePnP 进行高架相机的姿态估计会导致高度偏离几厘米

使用 SolvePNP 进行姿势估计

如何使用鱼眼相机参数解决 PnP?