我正在尝试使用OpenCV和C ++从同一台相机拍摄的2张图像中找到3D模型。我遵循了this方法。我仍然无法纠正R和T计算中的错误。
图片1:删除背景以消除不匹配
图像2:仅在X方向上翻译图像1已删除背景以消除不匹配
我使用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偏移)
我应该将关键点坐标与图像中心对齐,还是从校准中获得原理焦点?