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

时间:2015-10-03 08:09:20

标签: c++ opencv camera-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);

这种行为是否正常?

1 个答案:

答案 0 :(得分:0)

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

来自文档:

  

如果指定了CV_CALIB_USE_INTRINSIC_GUESS和/或CV_CALIB_FIX_ASPECT_RATIO,则必须在调用函数之前初始化fx,fy,cx,cy中的部分或全部。

  

CV_CALIB_USE_INTRINSIC_GUESS cameraMatrix包含进一步优化的fx,fy,cx,cy的有效初始值。否则,(cx,cy)最初设置为图像中心(使用imageSize),焦距以最小二乘方式计算。

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

尝试传入0而不是那个标志。