相機標定之棋盤標定

2021-08-29 07:53:05 字數 2871 閱讀 6101

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

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

自製棋盤格標定板 單目相機標定

單目相機標定方法可以選用matlab,ros,opencv等。對於非專門標定人員,了解其基本原理就可是實踐了,不需深究細究其公式解法 至少還是要看的懂 畢竟這是一門工程活。本文分別使用 opencv 和 kalibr 對某款手機的相機進行標定。官方教程如下 create calibration pa...

深度學習 相機標定 相機標定

術語 內參矩陣 intrinsic matrix 焦距 focal length 主點 principal point 徑向畸變 radial distortion 切向畸變 tangential distortion 旋轉矩陣 rotation matrices 平移向量 translation ...

相機標定(實踐)

關於相機標定,最常用的方法莫過於matlab和opencv了。這兩者的目標都是得到相機的內參矩陣 3 3 和誤差矩陣 5 1 至於原理我還來不及研究,已經迫不及待的想要了解怎麼採用這兩種現成的工具怎麼實現了?首先,在標定之前先採集標定板的,連線好要標定的攝像頭,做好乙個標定板。opencv自帶了乙個...