Computer vision 如果摄影机平移也在Z方向,平面场景的两个图像之间是否存在单应性?

Computer vision 如果摄影机平移也在Z方向,平面场景的两个图像之间是否存在单应性?,computer-vision,homography,Computer Vision,Homography,我试图计算两幅图像之间的相对姿势:我使用单应性来过滤特征匹配。我有一个相当平面的场景,只要两幅图像之间的平移仅限于X轴和Y轴(opencv约定),基于单应的相对姿势估计就可以非常准确地工作 一旦我开始使用另一个摄影机沿Z方向移动(第一个摄影机保持不变),相对姿势估计就无法正常工作,它会继续以非常低的Z平移估计姿势。虽然场景是平面的,但平移在Z方向时,单应性不适用吗 在此处附加图片:我将第二个摄影机移动到两个正方形中:一个在XY平面中,一个在XZ平面中。红色十字是摄影机平移的实际姿势(考虑地面真实

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

一旦我开始使用另一个摄影机沿Z方向移动(第一个摄影机保持不变),相对姿势估计就无法正常工作,它会继续以非常低的Z平移估计姿势。虽然场景是平面的,但平移在Z方向时,单应性不适用吗

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

我将同伦矩阵分解为旋转和平移的代码取自


这准确吗?单应矩阵的第三列是否编码完整的3D平移?

平移在Z方向时,单应不适用,尽管场景是平面的?

  • 如果有平面场景,则使用 透视相机(无镜头畸变)将由 同音字。这与相机是否旋转无关 翻译

  • 如果存在明显的镜头失真,则图像将不会显示 与同音字有关

  • 如果场景是非平面的,则图像将通过 只有在没有镜头变形和相机平移(只是旋转)的情况下,同音字才会出现

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


使用单应分解计算的三维平移达到了标准。这意味着两台摄像机之间返回的平移向量t与真实平移的比例因子s不同。不幸的是,s是不可恢复的。由于这个原因,通常将单目图像的三维重建称为度量重建(而不是解析真实比例的欧几里德重建)。要解决这个问题,还需要更多的信息,比如知道平面上某个点的深度或摄像机在图像之间移动的距离。

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


该函数中使用的方法在中进行了说明。

。。。请出示你的密码?它应该工作得很好,可能只是一些编程或逻辑错误。感谢您的评论,通过第三方库(openMVG)完成了单应矩阵的实际过滤和查找。事实上,我正在尝试解析比例,因为我有一个“先前”的三维地图,具有正确的尺寸,我正在比较我通过单应性相关重建获得的新地图与先前的地图之间的匹配。所以我确实有因子“s”,但问题不在于比例因子,而是在于我分解H矩阵的方式。
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]
}