相机标定之棋盘标定

该文章主要学习如何进行相机标定,原理部分只是比较多,不多赘述。

首先,相机标定主要是去求解内参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:角点数目

猜你喜欢

转载自blog.csdn.net/qq_38241538/article/details/83152265