关于opencv::triangulatePoints函数的注意事项

时间:2025-03-30 07:28:03
如果输入的是 归一化坐标(已除 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);