cvCalibrateCamera标定的一些问题

ydoudou 2015-08-15 06:23:08
最近研究摄像机标定,先用单目摄像机标定。发现如下问题:
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"?>
<opencv_storage>
<Intrinsics type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>f</dt>
<data>
1.30523621e+003 0. 3.19316345e+002 0. 1.31042041e+003
1.88144318e+002 0. 0. 1.</data></Intrinsics>
</opencv_storage>



<?xml version="1.0"?>
<opencv_storage>
<Distortion type_id="opencv-matrix">
<rows>5</rows>
<cols>1</cols>
<dt>f</dt>
<data>
7.49643818e-002 -7.14159346e+000 2.39964016e-003 -1.75716709e-002
7.27485962e+001</data></Distortion>
</opencv_storage>


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

<?xml version="1.0"?>
<opencv_storage>
<Intrinsics type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>f</dt>
<data>
1.30245691e+003 0. 3.19592133e+002 0. 1.30768018e+003
1.88326523e+002 0. 0. 1.</data></Intrinsics>
</opencv_storage>


<?xml version="1.0"?>
<opencv_storage>
<Distortion type_id="opencv-matrix">
<rows>5</rows>
<cols>1</cols>
<dt>f</dt>
<data>
7.38773346e-002 -7.05401230e+000 2.40107719e-003 -1.75304897e-002
7.13559875e+001</data></Distortion>
</opencv_storage>


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

本人使用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 ]

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

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


3. 得出的旋转向量和平移向量是什么意思?为什么我得不到旋转向量和平移向量,这两个参数带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,希望各位出谋划策,给点帮助,谢谢了。
...全文
2025 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
为什么用该标定函数得到的RT 矩阵是多个,那最后该按照哪个计算?
pr0gram 2016-01-24
  • 打赏
  • 举报
回复
坐标顺序无所谓,无非最后解算出来的外参数不同罢了。只要对应的世界坐标系的点和图像点一一对应就行了。
abaamys 2015-09-08
  • 打赏
  • 举报
回复
个人理解不知道对错一起分享下, 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; // 个人觉得应该是 在object_points 坐标中顺序是,x,y,z,而且可以是任意单位,所以乘以21.5是没有太大意义的(有人说你输入的单位是多少最后输出的结果就是多少,这只有在需要进行三维重建时有意义,只求内参数是没意义的)。 <?xml version="1.0"?> <opencv_storage> <Intrinsics type_id="opencv-matrix"> <rows>3</rows> <cols>3</cols> <dt>f</dt> <data> 1.30245691e+003 0. 3.19592133e+002 0. 1.30768018e+003 1.88326523e+002 0. 0. 1.</data></Intrinsics> </opencv_storage> 在这里面非零项依次对应fx,u0,fy,v0,注意到我们使用的影像坐标原点在左上角,因此影像中心实际位置是u0,v0分别减去影像尺寸的一半。 这是我个人的理解,或许有错,相互学习
abaamys 2015-09-08
  • 打赏
  • 举报
回复
我也遇到了同样的问题,希望高人指点,这么好的帖子别沉了
ydoudou 2015-08-24
  • 打赏
  • 举报
回复
没人知道吗?

4,505

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧