使用2张图像进行三维重建的基本矩阵SVD的不正确平移矩阵

时间:2017-10-08 18:37:33

标签: c++ opencv image-processing 3d-reconstruction pose-estimation

我正在尝试使用OpenCV和C ++从同一台相机拍摄的2张图像中找到3D模型。我遵循了this方法。我仍然无法纠正R和T计算中的错误。

图片1:删除背景以消除不匹配

img

图像2:仅在X方向上翻译图像1已删除背景以消除不匹配

img

我使用MATLAB Toolbox找到了内在相机矩阵(K)。我发现它是:

K =

[3058.8    0    -500

0       3057.3   488

0       0         1]

所有图像匹配关键点(使用SIFT和BruteForce匹配,消除不匹配)在图像中心对齐如下:

obj_points.push_back(Point2f(keypoints1[symMatches[i].queryIdx].pt.x - image1.cols / 2, -1 * (keypoints1[symMatches[i].queryIdx].pt.y - image1.rows / 2)));
scene_points.push_back(Point2f(keypoints2[symMatches[i].trainIdx].pt.x - image1.cols / 2, -1 * (keypoints2[symMatches[i].trainIdx].pt.y - image1.rows / 2)));

从Point Correspondeces,我在OpenCV中找到了使用RANSAC的基本矩阵

基本矩阵:

[0             0      -0.0014

0              0       0.0028

0.00149    -0.00572      1  ]

基本矩阵使用:

获得
E = (camera_Intrinsic.t())*f*camera_Intrinsic;

E获得:

[ 0.0094        36.290       1.507

-37.2245        -0.6073      14.71

-1.3578         -23.545     -0.442]

E的SVD:

E.convertTo(E, CV_32F);
Mat W = (Mat_<float>(3, 3) << 0, -1, 0, 1, 0, 0, 0, 0, 1);
Mat Z = (Mat_<float>(3, 3) << 0, 1, 0, -1, 0, 0, 0, 0, 0);

SVD decomp = SVD(E);
Mat U = decomp.u;
Mat Lambda = decomp.w;
Mat Vt = decomp.vt;  

极线约束的新基本矩阵:

Mat diag = (Mat_<float>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 0);
Mat new_E = U*diag*Vt;

SVD new_decomp = SVD(new_E);

Mat new_U = new_decomp.u;
Mat new_Lambda = new_decomp.w;
Mat new_Vt = new_decomp.vt;

从SVD轮换:

Mat R1 = new_U*W*new_Vt;
Mat R2 = new_U*W.t()*new_Vt;

来自SVD的翻译:

Mat T1 = (Mat_<float>(3, 1) << new_U.at<float>(0, 2), new_U.at<float>(1, 2), new_U.at<float>(2, 2));
Mat T2 = -1 * T1;

我得到R矩阵:

R1:

[ -0.58      -0.042     0.813
-0.020       -0.9975    -0.066
 0.81        -0.054     0.578]

R2:

[  0.98     0.0002      0.81
  -0.02      -0.99      -0.066
  0.81      -0.054      0.57 ]

翻译矩阵:

T1:

  

[0.543

     

-0.030

     

0.838]

T2:

  

[ - 0.543

     

0.03

     

-0.83]

请在出现错误的地方澄清。

这4组P2矩阵R | T与P1 = [I]给出了不正确的三角模型。

另外,我认为获得的T矩阵是不正确的,因为它应该只是x移位而没有z移位。

尝试使用相同的image1 = image2 - &gt;我得到T = [0,0,1]。 Tz = 1是什么意思? (因为两个图像都相同,所以没有z偏移)

我应该将关键点坐标与图像中心对齐,还是从校准中获得原理焦点?

0 个答案:

没有答案