相機標定之棋盤標定
該文章主要學習如何進行相機標定,原理部分只是比較多,不多贅述。
首先,相機標定主要是去求解內參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:角點數目