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

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 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?