该文章主要学习如何进行相机标定,原理部分只是比较多,不多赘述。
首先,相机标定主要是去求解内参K和外参(R|T)。以下为相机标定过程中常用的opencv自带的几个重要函数。
1.opencv 提供的函数ProjectPoints2(),投影三维点到图像二维点。函数参数如下
void cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector, const CvMat* translation_vector, const CvMat* intrinsic_matrix, const CvMat* distortion_coeffs, CvMat* image_points, CvMat* dpdrot=NULL, CvMat* dpdt=NULL, CvMat* dpdf=NULL, CvMat* dpdc=NULL, CvMat* dpddist=NULL );
object_points:物体点的坐标,为3*N或者N*3的矩阵,N是视图中所有点的数目
rotation_vector:旋转向量1*3
translation_vector:平移向量 1*3
intrisic_vector:相机内参 其可由calibrateCamera完成
image_Points:输出数组,存储图像点的坐标,2*N
2.FindHomography(): 计算两个平面之间的透视变换。函数参数如下:
void cvFindHomography( const CvMat* src_points, const CvMat* dst_points, CvMat* homography );
src_points:原始平面点坐标 2*N,N*2,3*N(表示其次坐标)。
dst_points:目标平面点坐标2*N,N*2,3*N(同理)。
homograohy:3*3透视矩阵。
3.Calibratecamera2()利用棋盘点计算摄像机的内参数和外参数,其中该外参数是基于棋盘的(Z=0),函数参数如下:
void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points, const CvMat* point_counts, CvSize image_size, CvMat* intrinsic_matrix, CvMat* distortion_coeffs, CvMat* rotation_vectors=NULL, CvMat* translation_vectors=NULL, int flags=0 );
object_points:定标点的世界坐标,为3*N,这个N是所有视图中点的总数。
image_points:定标点的图像坐标,为2*n,N同理。
image_size: 图像大小。
intrinsic_matrix: 输出内参矩阵
distoration_coeffs:畸变参数
roration_vectors:旋转向量(Rodrigues可将旋转向量转化为旋转矩阵)
translation_vectors:平移向量
4.FindExtrinsicCameraParams2()计算指定视图的摄像机外参,函数参数如下:
void cvFindExtrinsicCameraParams2( const CvMat* object_points, const CvMat* image_points, const CvMat* intrinsic_matrix, const CvMat* distortion_coeffs, CvMat* rotation_vector, CvMat* translation_vector );
object_points:定标点的坐标,为3*N或者N*3的矩阵,这里N是视图中的个数。
image_points:定标点在图像内的坐标,为2*N的矩阵,(同理)。
intrinsic_matrix:内参矩阵
distoration_coeffs:畸变向量
rotation_vector:旋转向量
traslation_vector:平移矩阵
4.Rodrigues2旋转矩阵和旋转向量间的转化
int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );
5.FindchessboardCorners寻找棋盘内角点的位置,函数参数如下:
int cvFindChessboardCorners( const void* image, CvSize pattern_size, CvPoint2D32f* corners, int* corner_count=NULL, int flags=CV_CALIB_CB_ADAPTIVE_THRESH );
image: 输入的棋盘图 (必须是8位的灰度或者彩色图)
pattern_size:棋盘图中的每行每列的个数。
corners:检测到的角点
corner_count:角点的个数
6.DrawChessBoardCorners() 绘制检测到的角点,函数参数如下:
void cvDrawChessboardCorners( CvArr* image, CvSize pattern_size, CvPoint2D32f* corners, int count, int pattern_was_found );
image:图像
pattern_size:行列内角点数目
corners:检测到的角点数目
count:角点数目