ydoudou 2015-08-15 10:26 采纳率: 50%
浏览 4120

cvCalibrateCamera标定的一些问题

最近研究摄像机标定,先用单目摄像机标定。发现如下问题:
1. cvCalibrateCamera第一个参数object_points是角点在世界坐标系中坐标(世界坐标系原点在第一个角点位置,标定板所有点坐标都在Z=0的平面上)。
第二个参数image_points是角点在图像坐标系中坐标(图像坐标系原点在第一个角点位置)。这个参数可以通过cvfindchessboardcorners函数得到。

提取出来的角点坐标image_points包含的是图像中先按照从左到右,再从上到下顺序存储的坐标值。理论上第一个参数的点应该和第二个参数对应上,可是我发现opencv书中的代码是先从上到下,再从左至右:

step = successes*board_n;
for( int i=step, j=0; j<board_n; ++i,++j ) {
CV_MAT_ELEM(*image_points, float,i,0) = corners[j].x;
CV_MAT_ELEM(*image_points, float,i,1) = corners[j].y;
CV_MAT_ELEM(*object_points,float,i,0) = (j/board_w)*21.5; // 个人觉得应该是CV_MAT_ELEM(*object_points,float,i,0) = j%board_w;
CV_MAT_ELEM(*object_points,float,i,1) = (j%board_w)*21.5; // 个人觉得应该是CV_MAT_ELEM(*object_points,float,i,0) = j/board_w;
CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;
}

源代码坐标依次是(0,0,0),(0,1*21.5,0),(0,2*21.5,0).....是先从上到下。
我的代码坐标依次是(0,0,0),(1*21.5,0,0),(2*21.5,0,0) .....是从左至右。

而标定板上检测出的角点顺序是先从左至右,再从上到下。不知道哪个正确?? 两个方法我都试了,效果并没有明显不同。

得出的摄像机内矩阵和畸变系数分别是
<?xml version="1.0"?>


3
3

f


1.30523621e+003 0. 3.19316345e+002 0. 1.31042041e+003
1.88144318e+002 0. 0. 1.

<?xml version="1.0"?>


5
1

f


7.49643818e-002 -7.14159346e+000 2.39964016e-003 -1.75716709e-002
7.27485962e+001

////////////////////////////////////////////////////////////////////////////////////////

<?xml version="1.0"?>


3
3

f


1.30245691e+003 0. 3.19592133e+002 0. 1.30768018e+003
1.88326523e+002 0. 0. 1.

<?xml version="1.0"?>


5
1

f


7.38773346e-002 -7.05401230e+000 2.40107719e-003 -1.75304897e-002
7.13559875e+001

//////////////////////////////////////////////////////////////////////

本人使用matlab也做了校正,得出的摄像机内矩阵和畸变系数如下:

Focal Length: fc = [ 17702.95064 18428.99257 ]  [ 2237.98276 2860.08116 ]
Principal point: cc = [ 319.50000 239.50000 ]  [ 0.00000 0.00000 ]
Skew: alpha_c = [ 0.00000 ]  [ 0.00000 ] => angle of pixel axes = 90.00000  0.00000 degrees
Distortion: kc = [ -59.26465 210144.98702 0.23047 -0.55149 0.00000 ]  [ 62.11093 310619.70504 0.10025 0.08585 0.00000 ]
Pixel error: err = [ 1.10052 1.13712 ]

相差很多,不知道哪出现问题了。

  1. 如何验证校验结果,使用matlab进行标定发现得出的摄像机内矩阵和畸变系数与自己写代码得出差很多,见上面。通过右眼看校正后的图像看不出来校正效果。因为原图像本身就没有太大的畸变。

  2. 得出的旋转向量和平移向量是什么意思?为什么我得不到旋转向量和平移向量,这两个参数带NULL是没有问题的

    cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image), intrinsic_matrix, distortion_coeffs, 0, 0,0);
    

但是带入向量就会出现unhandled exception,代码如下:

    cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image), intrinsic_matrix, distortion_coeffs, rotation_vectors, translation_vectors, CV_CALIB_USE_INTRINSIC_GUESS);

新人刚研究opencv,希望各位出谋划策,给点帮助,谢谢了。

  • 写回答

1条回答

  • 3D视觉工坊 博客专家认证 2018-08-23 06:21
    关注

    作者的介绍很详细,也推荐公众号中比较不错的一篇(一分钟详解OpenCV之相机标定函数calibrateCamera()):https://mp.weixin.qq.com/s/sZNubF-pTvu8dD8bfAXCIQ

    评论

报告相同问题?

悬赏问题

  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿