我试图计算两幅图像之间的相对位姿:我正在使用同调法来过滤特征匹配。我有一个相当平面的场景,基于同形的相对位姿估计工作非常准确,只要两幅图像之间的平移仅限于X和Y轴(opencv惯例)。
一旦我开始与另一个相机向Z方向移动(第一个相机保持不变),相对位姿估计就不能正常工作,它会一直以很低的Z平移来估计姿态。虽然场景是平面的,但当翻译的方向是Z方向时,是否不适用同调法?
在这里附加一张图片:我把第二个相机移动到两个方格中:一个在XY平面,一个在XZ平面。红色的十字是相机转换的实际姿势(认为它是地面真实的),蓝色的圆圈是通过基于RANSAC的同调估计的相对姿态。注意在X和Y中移动时的精度,以及Z方向上的完全失败:所有的估计都接近z=0平面。

我将同伦矩阵分解成旋转和平移的代码是从这个StackExchange的答案中提取的。
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]
}这个准确吗?同形矩阵的第三列是否编码全三维翻译?
发布于 2018-01-28 14:55:12
问题确实在于我分解同形矩阵的方式:我在问题中发布的方法似乎是不正确的。同形矩阵的最后一列不编码完整的3D翻译。将矩阵分解为OpenCV函数(decomposeHomographyMat),将矩阵分解为4种可能的三维平移和旋转解。
该函数中使用的方法在本论文中得到了解释。
发布于 2018-01-26 10:00:59
当平移是z方向时,不适用于同调,虽然场景是平面的?
相对位姿估计不能正常工作,它用极低的Z平移来估计姿态
采用同形分解的三维平移计算达到了规模。这意味着两个摄像机之间返回的翻译向量t与真实的平移相差很大,不幸的是s是不可恢复的。通常,单目图像的三维重建就是基于这个原因的度量重建(而不是欧几里得重建,在真正的尺度被解决)。要解决这些问题,需要更多的信息,如了解平面上点的深度或摄像机在图像之间移动的距离。
https://stackoverflow.com/questions/48436342
复制相似问题