單目相機標定

2021-08-08 14:57:46 字數 3541 閱讀 3407

主要**

執行前需要先準備標定和記錄標定列表的文字檔案,並放入程式所在目錄下

文字檔案的內容如下:

calibdata.txt

裡面填寫好需要標定的名稱

for (int ii=0 ; iiif (0 == ii%cornernum)// 24 是每幅的角點個數。此判斷語句是為了輸出 號,便於控制台**

//輸出所有的角點

cout

<<" -->"

<0].x;

cout

<<" -->"

<0].y;

}cout

<<"角點提取完成!\n";

//以下是攝像機標定

cout

<<"開始標定………………";

/*棋盤三維資訊*/

size square_size = size(20,20); /* 實際測量得到的標定板上每個棋盤格的大小 */

vector

> object_points; /* 儲存標定板上角點的三維座標 */

/*內外引數*/

mat cameramatrix=mat(3,3,cv_32fc1,scalar::all(0)); /* 攝像機內引數矩陣 */

vector

point_counts; // 每幅影象中角點的數量

mat distcoeffs=mat(1,5,cv_32fc1,scalar::all(0)); /* 攝像機的5個畸變係數:k1,k2,p1,p2,k3 */

vector

tvecsmat; /* 每幅影象的旋轉向量 */

vector

rvecsmat; /* 每幅影象的平移向量 */

/* 初始化標定板上角點的三維座標 */

int i,j,t;

for (t=0;tvector

temppointset;

for (i=0;ifor (j=0;j/* 假設標定板放在世界座標系中z=0的平面上 */

realpoint.x = i*square_size.width;

realpoint.y = j*square_size.height;

realpoint.z = 0;

temppointset.push_back(realpoint);}}

object_points.push_back(temppointset);

}/* 初始化每幅影象中的角點數量,假定每幅影象中都可以看到完整的標定板 */

for (i=0;i/* 開始標定 */

calibratecamera(object_points,image_points_seq,image_size,cameramatrix,distcoeffs,rvecsmat,tvecsmat,0);

cout

<<"標定完成!\n";

//對標定結果進行評價

cout

<<"開始評價標定結果………………\n";

double total_err = 0.0; /* 所有影象的平均誤差的總和 */

double err = 0.0; /* 每幅影象的平均誤差 */

vector

image_points2; /* 儲存重新計算得到的投影點 */

cout

<<"\t每幅影象的標定誤差:\n";

fout<<"每幅影象的標定誤差:\n";

for (i=0;ivector

temppointset=object_points[i];

/* 通過得到的攝像機內外引數,對空間的三維點進行重新投影計算,得到新的投影點 */

projectpoints(temppointset,rvecsmat[i],tvecsmat[i],cameramatrix,distcoeffs,image_points2);

/* 計算新的投影點和舊的投影點之間的誤差*/

vector

tempimagepoint = image_points_seq[i];

mat tempimagepointmat = mat(1,tempimagepoint.size(),cv_32fc2);

mat image_points2mat = mat(1,image_points2.size(), cv_32fc2);

for (int j = 0 ; j < tempimagepoint.size(); j++)

err = norm(image_points2mat, tempimagepointmat, norm_l2);

total_err += err/= point_counts[i];

std::cout

<<"第"

<1

<<"幅影象的平均誤差:"

<"畫素"

<"第"

<1

<<"幅影象的平均誤差:"

<"畫素"

<<"總體平均誤差:"

<"畫素"

<"總體平均誤差:"

<"畫素"

<<"評價完成!"

std::cout

<<"開始儲存定標結果………………"

<3,3,cv_32fc1, scalar::all(0)); /* 儲存每幅影象的旋轉矩陣 */

fout<<"相機內引數矩陣:"

<"畸變係數:\n";

fout<1

<<"幅影象的旋轉向量:"

rodrigues(tvecsmat[i],rotation_matrix);

fout<<"第"

<1

<<"幅影象的旋轉矩陣:"

<"第"

<1

<<"幅影象的平移向量:"

<<"完成儲存"

<"pause");

return

0;}

單目相機標定

1 matlbe 單目標定步驟 常用術語 中文名 英文名 內參矩陣 intrinsic matrix 焦距 focal length 主點 principal point 徑向畸變 radial distortion 切向畸變 tangential distortion 旋轉矩陣 rotation ...

ros單目相機標定

記錄一下使用ros進行單目相機標定的過程。roslaunch usb cam usb cam test.launch2.安裝ros的標定功能包 sudo apt get install ros melodic camera calibration 3.執行ros標定功能包 0.0375是指單個網格的...

opencv相機標定 2 單目相機標定流程

常用的標定函式和流程,網上一大堆,這裡就不想詳細寫了 這裡說一下標定後常見的問題和我自己的一些做法。畸變校正後,邊緣處出現一些黑色畫素區域,其實也算是正常的,去畸變後補充的畫素 比例係數 newcameramatrix.at double 0 0 newcameramatrix.at double ...