为什么我的相机矩阵在校准后是单位矩阵

Why my camera matrix is an identity matrix after calibration

使用 OpenCV 中的一些样本数据校准我的相机后,我的相机矩阵变成了单位矩阵。
这是我的代码:

std::vector<cv::Point3f> t_3d;
t_3d.push_back(cv::Point3f(50, 100, 0));
t_3d.push_back(cv::Point3f(375, 100, 0));
t_3d.push_back(cv::Point3f(50, 1600, 0));
t_3d.push_back(cv::Point3f(750, 1600, 0));
object_points.push_back(t_3d);

std::vector<cv::Point2f> t_2d;
t_2d.push_back(cv::Point2f(2.27556, 98.9867));
t_2d.push_back(cv::Point2f(631.467, 58.0267));
t_2d.push_back(cv::Point2f(207.076, 1020.59));
t_2d.push_back(cv::Point2f(1061.55, 969.387));
image_points.push_back(t_2d);

cv::calibrateCamera(object_points, image_points, cv::Size(1440, 900), cam_mat,
                    dist_coeffs, rvecs, tvecs, CV_CALIB_USE_INTRINSIC_GUESS);

这种行为正常吗?

根据 docs,您需要至少部分地预先初始化相机矩阵。

来自文档:

If CV_CALIB_USE_INTRINSIC_GUESS and/or CV_CALIB_FIX_ASPECT_RATIO are specified, some or all of fx, fy, cx, cy must be initialized before calling the function.

CV_CALIB_USE_INTRINSIC_GUESS cameraMatrix contains valid initial values of fx, fy, cx, cy that are optimized further. Otherwise, (cx, cy) is initially set to the image center ( imageSize is used), and focal distances are computed in a least-squares fashion.

在你的情况下,由于你没有将 cam_mat 设置为任何值,我相信 c_x 和 c_y 被设置为图像中心(大概是 (0,0 )) 焦距 f_x 和 f_y 是 1 因为你使用 CV_CALIB_USE_INTRINSIC_GUESS.

尝试传入 0 而不是该标志。