K
),那么投影矩阵就不应该包含 K
。正确方法 1:使用归一化坐标
// 1. 去畸变,得到归一化坐标
cv::undistortPoints(projPoints_left, projPoints_left, K_left, dist_left);
cv::undistortPoints(projPoints_right, projPoints_right, K_right, dist_right);
// 2. 只使用 [R | T] 作为投影矩阵
cv::Mat P1 = RT_left;
cv::Mat P2 = RT_right;
// 3. 三角化
cv::triangulatePoints(P1, P2, projPoints_left, projPoints_right, Final_points3D);
正确方法 2:保持像素坐标
如果希望直接在像素坐标下进行三角化,可以在 cv::undistortPoints()
中传入 新的投影矩阵 P=K
,让输出点保持在像素坐标系:
// 1. 去畸变,但保持像素坐标 cv::undistortPoints(projPoints_left, projPoints_left, K_left, dist_left, cv::noArray(), K_left); cv::undistortPoints(projPoints_right, projPoints_right, K_right, dist_right, cv::noArray(), K_right); // 2. 计算投影矩阵 (带K) cv::Mat P1 = K_left * RT_left; cv::Mat P2 = K_right * RT_right; // 3. 三角化 cv::triangulatePoints(P1, P2, projPoints_left, projPoints_right, Final_points3D);