1. 程式人生 > >相機標定之棋盤標定

相機標定之棋盤標定

該文章主要學習如何進行相機標定,原理部分只是比較多,不多贅述。

首先,相機標定主要是去求解內參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:角點數目