为什么我的相机矩阵是一个单位矩阵后校准
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);
此行为是否正常?
根据文档,您需要至少预先初始化相机矩阵的一部分。
From the 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。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 打印一个变量将打印另一个变量的值(以 C++ 为单位)
- 快速简单的方法,以C++为单位一次读取一个字节的 stdin
- put_time具有转换说明符,该转换指定符,该指定符在一个月的单个数字上输出没有前面字符的单位天数
- 控制一个字符串是否存在于另一个字符串中(以 C++ 为单位)
- 如何得出结论,如果一个单位的士兵在网格地图上连接
- 使用向量C++中的一个向量建立一个单位矩阵
- 如何在提升单位中定义从另一个派生维度的派生维度
- 制作一个计时器,在以毫秒为单位的一定时间后执行某个函数
- 如何在cpp中创建一个固定大小(以内存为单位)的哈希表
- 设计一个结构来存储时间和日期.写一个函数来计算两个时间之间的差(以分钟为单位)
- 为什么我的相机矩阵是一个单位矩阵后校准
- 从输入中获取一个数字和一个单位作为双精度和字符串——编程:使用c++的原则和实践
- 如何在一个有意义的单位中关联(X,Y)坐标对
- 如何找到所有不同的组合作为一个字符串的字符的不同长度的单位