最近弄相机标定,然后发现OpenCV中自带的函数cvCalibrateCamera2,它用的是张氏标定的方法,具体过程我也没多懂,但是基本明白,其实它就是几个矩阵neng来neng去。哎……
关于cvCalibrateCamera2这个函数,官方的参数是:1
2
3
4
5
6
7
8
9
10
11
12public:
static void cvCalibrateCamera2(
IntPtr object_points,
IntPtr image_points,
IntPtr point_counts,
MCvSize image_size,
IntPtr intrinsic_matrix,
IntPtr distortion_coeffs,
IntPtr rotation_vectors,
IntPtr translation_vectors,
int flags
)
其中各个参数的作用:
object_points (IntPtr)
官方:The joint matrix of object points, 3xN or Nx3, where N is the total number of points in all views
我的:这个就是张氏标定里面的世界坐标,3代表世界坐标的x,y,z。一般都令z=0,因为世界坐标是图片中棋盘角点的位置,所以,世界坐标一般都是“算”出来的,从左上角的(0,0)开始,只要知道实际上棋盘格子中每个小格子的宽度,就能得到整个棋盘点的坐标。N的话要结合另一个参数point_counts,比如说有10张标定的照片,每张的角点数是20,那么N就是20*10
image_points (IntPtr)
官方:The joint matrix of corresponding image points, 2xN or Nx2, where N is the total number of points in all views
我的:这个是由计算机得出来的角点坐标集合,就是计算机识别出来的角点的位置,一般先由cvFindChessboardCorners求出大致坐标,再又cvFindCornerSubPix通过迭代来发现具有子像素精度的角点位置。
前面两个参数其实是对应的,一个世界坐标对应一个图像坐标,如果有多张图片的话,放在同一个矩阵。类似于定义一个queue,然后把第一张图片的角点位置一个一个push进去,然后再第二张图片的角点位置一个一个push进去,一直这样……
point_counts (IntPtr)
官方:Vector containing numbers of points in each particular view, 1xM or Mx1, where M is the number of a scene views
我的:就是每张照片的角点个数,仅此。
image_size (MCvSize)
官方:Size of the image, used only to initialize intrinsic camera matrix
我的:相片的实际大小,一般右键查看相片的属性就能获得
intrinsic_matrix (IntPtr)
官方:The output camera matrix (A) [fx 0 cx; 0 fy cy; 0 0 1]. If CV_CALIB_USE_INTRINSIC_GUESS and/or CV_CALIB_FIX_ASPECT_RATION are specified, some or all of fx, fy, cx, cy must be initialized
我的:获得的相机的内参,就是张氏标定的内参矩阵
distortion_coeffs (IntPtr)
官方:The output 4x1 or 1x4 vector of distortion coefficients [k1, k2, p1, p2]
我的:就是张氏标定里面的畸变参数
rotation_vectors (IntPtr)
官方:The output 3xM or Mx3 array of rotation vectors (compact representation of rotation matrices, see cvRodrigues2).
我的:旋转向量,由于一张照片就有一个旋转角度,所以这里的M表示有多少张照片,如果要第3张的参数就是这个矩阵的第三列
translation_vectors (IntPtr)
官方:The output 3xM or Mx3 array of translation vectors
我的:平移向量,由于一张照片就有一个平移位置,所以这里的M也表示有多少张照片。
flags (Int32)
官方:Different flags
百度百科:
不同的标志,可以是0,或者下面值的组合:
- CV_CALIB_USE_INTRINSIC_GUESS - 内参数矩阵包含fx,fy,cx和cy的初始值。否则,(cx, cy)被初始化到图像中心(这儿用到图像大小),焦距用最小平方差方式计算得到。注意,如果内部参数已知,没有必要使用这个函数,使用cvFindExtrinsicCameraParams2则可。
- CV_CALIB_FIX_PRINCIPAL_POINT - 主点在全局优化过程中不变,一直在中心位置或者在其他指定的位置(当CV_CALIB_USE_INTRINSIC_GUESS设置的时候)。
- CV_CALIB_FIX_ASPECT_RATIO - 优化过程中认为fx和fy中只有一个独立变量,保持比例fx/fy不变,fx/fy的值跟内参数矩阵初始化时的值一样。在这种情况下, (fx, fy)的实际初始值或者从输入内存矩阵中读取(当CV_CALIB_USE_INTRINSIC_GUESS被指定时),或者采用估计值(后者情况中fx和fy可能被设置为任意值,只有比值被使用)。
- CV_CALIB_ZERO_TANGENT_DIST – 切向形变参数(p1, p2)被设置为0,其值在优化过程中保持为0。