最近研究摄像机标定,先用单目摄像机标定。发现如下问题:
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
<?xml version="1.0"?>
5
1
////////////////////////////////////////////////////////////////////////////////////////
<?xml version="1.0"?>
3
3
<?xml version="1.0"?>
5
1
//////////////////////////////////////////////////////////////////////
本人使用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 ]
相差很多,不知道哪出现问题了。
如何验证校验结果,使用matlab进行标定发现得出的摄像机内矩阵和畸变系数与自己写代码得出差很多,见上面。通过右眼看校正后的图像看不出来校正效果。因为原图像本身就没有太大的畸变。
得出的旋转向量和平移向量是什么意思?为什么我得不到旋转向量和平移向量,这两个参数带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,希望各位出谋划策,给点帮助,谢谢了。
作者的介绍很详细,也推荐公众号中比较不错的一篇(一分钟详解OpenCV之相机标定函数calibrateCamera()):https://mp.weixin.qq.com/s/sZNubF-pTvu8dD8bfAXCIQ