如果相机平移也在Z方向,那么对于平面场景,两个图像之间是否存在单应性?

时间:2018-01-25 05:42:25

标签: computer-vision homography

我正在尝试计算两个图像之间的相对姿势:我正在使用单应性来过滤特征匹配。我有一个相当平面的场景,只要两个图像之间的平移仅限于X轴和Y轴(opencv惯例),基于单应性的相对姿态估计就可以非常准确地工作。

一旦我开始使用另一台摄像机在Z方向上移动(第一台摄像机保持不变),相对姿势估计不能正常工作,它会以非常低的Z平移继续估计姿势。当平移在Z方向时,均匀性不适用,尽管场景是平面的吗?

在此处附加图片:我将第二个相机移动到两个正方形中:一个在XY平面中,一个在XZ平面中。红色十字架是相机平移的实际姿势(考虑它是地面实况),蓝色圆圈是通过基于单应性的RANSAC估计的相对姿势。注意在X和Y中移动时的准确性,以及Z方向上的完全失败:所有估计都接近z = 0平面。

enter image description here

我将同性恋矩阵分解为旋转和翻译的代码取自this StackExchange answer

void cameraPoseFromHomography(const Mat& H, Mat& pose)
{
    pose = Mat::eye(3, 4, CV_64FC1); //3x4 matrix
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;

    Mat v1 = H.col(0);
    Mat v2 = pose.col(0);

    cv::normalize(v1, v2); // Normalize the rotation

    v1 = H.col(1);
    v2 = pose.col(1);

    cv::normalize(v1, v2);

    v1 = pose.col(0);
    v2 = pose.col(1);

    Mat v3 = v1.cross(v2);  //Computes the cross-product of v1 and v2
    Mat c2 = pose.col(2);
    v3.copyTo(c2);      

    pose.col(3) = H.col(2) / tnorm; //vector t [R|t]
}

这准确吗?单应矩阵的第三列是否编码全3D翻译?

2 个答案:

答案 0 :(得分:0)

虽然场景是平面的,但是当平移在Z方向时,均匀性不适用吗?

  • 如果您有平面场景,则使用a 所有图像 透视相机(没有镜头失真)将与之相关 单应性。无论相机是旋转还是旋转都无关紧要 翻译。

  • 如果有明显的镜头失真,则图像不会 由独角兽相关。

  • 如果场景是非平面的,则图像将相关联 只有在没有镜头失真且没有摄像机平移(只是旋转)的情况下才会出现单应性。

相对姿势估计无法正常工作,它会以非常低的Z平移估计姿势

使用单应性分解计算的3D平移是按比例的。这意味着两个摄像机之间返回的平移向量 t 与真正的平移因子 s 不同。不幸的是 s 无法恢复。通常,单眼图像的3D重建被称为 metric 重建,因此(而不是 Euclidean 重建,其中真实尺度被解析)。要解决 s ,需要更多信息,例如了解平面上某点的深度或相机在图像之间移动的距离。

答案 1 :(得分:0)

问题确实与我分解单应矩阵的方式有关:我在问题中发布的方法似乎是不正确的。单应矩阵的最后一列不编码全3D翻译。正确的分解方法是作为OpenCV函数(decomposeHomographyMat)提供的,其中矩阵被分解为4种可能的全3D平移和旋转解决方案。

https://github.com/opencv/opencv/blob/master/modules/calib3d/src/homography_decomp.cpp#L435

该功能中使用的方法在this paper中解释。