首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果相机平移也是在Z方向的话,平面场景中的两幅图像之间是否存在同调?

如果相机平移也是在Z方向的话,平面场景中的两幅图像之间是否存在同调?
EN

Stack Overflow用户
提问于 2018-01-25 05:42:24
回答 2查看 1.7K关注 0票数 2

我试图计算两幅图像之间的相对位姿:我正在使用同调法来过滤特征匹配。我有一个相当平面的场景,基于同形的相对位姿估计工作非常准确,只要两幅图像之间的平移仅限于X和Y轴(opencv惯例)。

一旦我开始与另一个相机向Z方向移动(第一个相机保持不变),相对位姿估计就不能正常工作,它会一直以很低的Z平移来估计姿态。虽然场景是平面的,但当翻译的方向是Z方向时,是否不适用同调法?

在这里附加一张图片:我把第二个相机移动到两个方格中:一个在XY平面,一个在XZ平面。红色的十字是相机转换的实际姿势(认为它是地面真实的),蓝色的圆圈是通过基于RANSAC的同调估计的相对姿态。注意在X和Y中移动时的精度,以及Z方向上的完全失败:所有的估计都接近z=0平面。

我将同伦矩阵分解成旋转和平移的代码是从这个StackExchange的答案中提取的。

代码语言:javascript
复制
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]
}

这个准确吗?同形矩阵的第三列是否编码全三维翻译?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-28 14:55:12

问题确实在于我分解同形矩阵的方式:我在问题中发布的方法似乎是不正确的。同形矩阵的最后一列不编码完整的3D翻译。将矩阵分解为OpenCV函数(decomposeHomographyMat),将矩阵分解为4种可能的三维平移和旋转解。

decomp.cpp#L435

该函数中使用的方法在本论文中得到了解释。

票数 1
EN

Stack Overflow用户

发布于 2018-01-26 10:00:59

当平移是z方向时,不适用于同调,虽然场景是平面的?

  • 如果你有一个平面场景,那么使用透视相机(没有镜头畸变)的所有图像都将与同音相关。这并不重要,无论相机是旋转还是平移。
  • 如果有明显的镜头畸变,那么图像将不会与同音相关。
  • 如果场景是非平面的,那么只有在没有镜头畸变和相机平移(仅仅是旋转)的情况下,图像才会与同音相关。

相对位姿估计不能正常工作,它用极低的Z平移来估计姿态

采用同形分解的三维平移计算达到了规模。这意味着两个摄像机之间返回的翻译向量t与真实的平移相差很大,不幸的是s是不可恢复的。通常,单目图像的三维重建就是基于这个原因的度量重建(而不是欧几里得重建,在真正的尺度被解决)。要解决这些问题,需要更多的信息,如了解平面上点的深度或摄像机在图像之间移动的距离。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48436342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档