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

2021-10-07 13:09:52 字數 4010 閱讀 5040

常用的標定函式和流程,網上一大堆,這裡就不想詳細寫了

這裡說一下標定後常見的問題和我自己的一些做法。

畸變校正後,邊緣處出現一些黑色畫素區域,其實也算是正常的,去畸變後補充的畫素

//比例係數

newcameramatrix.at<

double

>(0

,0)= newcameramatrix.at<

double

>(0

,0)/ scale;

newcameramatrix.at<

double

>(1

,1)= newcameramatrix.at<

double

>(1

,1)/ scale;

initundistortrectifymap

(cameramatrix, distcoeffs, matx33d::

eye(

), newcameramatrix, picsize, cv_32fc1, mapx, mapy)

;for

(int i =

0; i < files.

size()

; i++

)個人理解,修改fx,fy相當於修改了相機成像模型中最後一步,相機物理座標系->相機畫素座標系這一步,因此看起來的效果實際只是比例縮放。效果圖(影象解析度不變)如下

這種需求相當於相機安裝不正的情形吧,效果上相當於使棋盤方向與影象方向一致。這部分還沒辦法完全理解,暫時先放下了

這個主要是一些工業應用的方便性,例如直接在影象作向量圖,直接切割使切的位置就是向量圖在影象上顯示的位置。這部分應該用仿射變換就行了。暫時沒做。

相機標定流程和常用的運算元**如下:

#include

"learnbasic.h"

#include

"stdio.h"

#include

#include

#include

void

listfiles

(string path, vector

& files)

else

}while

(_findnext

(hfile,

&fileinfo)==0

);_findclose

(hfile);}

}void

calibration()

//檢測所有棋盤角點

mat img, img_gray, showimg;

namedwindow

("img"

, window_normal)

;for

(int i =

0; i < files.

size()

; i++

) worldpoints.

push_back

(worldpoint)

;cornersubpix

(img_gray, imgpoint, cv::

size(3

,3), cv::

size(-

1,-1

),cv::

termcriteria

(cv::termcriteria::max_iter + termcriteria::eps,30,

0.1));

imgpoints.

push_back

(imgpoint)

;drawchessboardcorners

(img, cv::

size

(colnum, rownum)

, imgpoint,

true);

// imshow("img", img);

// waitkey(0);

}double err = cv::

calibratecamera

(worldpoints, imgpoints, picsize,

cameramatrix, distcoeffs, rvecs, tvecs

/*,calib_thin_prism_model*/);

//flag不設定,只計算五個畸變係數。其他相機模型要詳細研究flag引數

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

cout <<

"cameramatrix:"

<< cameramatrix << endl;

cout <<

"distcoeffs:"

<< distcoeffs << endl;

cout <<

"標定誤差:"

<< err << endl;

vector prj_points, undistort_points;

for(

int i =

0; i < files.

size()

; i++

)//另一種畸變校正影象方式,undistort內部好像每次也是呼叫initundistortrectifymap和remap,效率不高

mat mapx, mapy;

initundistortrectifymap

(cameramatrix, distcoeffs, matx33d::

eye(

), cameramatrix, picsize, cv_32fc1, mapx, mapy)

;for

(int i =

0; i < files.

size()

; i++

)//顯示優化、調整

//影象畸變校正後,邊緣容易一些黑色畫素,不美觀

//可以虛擬修改相機fx,fy引數,即相當於使用了乙個更小或更大的靶面尺寸

mat newcameramatrix = cameramatrix.

clone()

;double scale =

0.95

;//比例係數

newcameramatrix.at<

double

>(0

,0)= newcameramatrix.at<

double

>(0

,0)/ scale;

newcameramatrix.at<

double

>(1

,1)= newcameramatrix.at<

double

>(1

,1)/ scale;

initundistortrectifymap

(cameramatrix, distcoeffs, matx33d::

eye(

), newcameramatrix, picsize, cv_32fc1, mapx, mapy)

;for

(int i =

0; i < files.

size()

; i++

)//若想最終得到的影象方向跟世界座標系方向一致,可以加入旋轉矩陣

mat rotatemtx;

newcameramatrix = cameramatrix.

clone()

;for

(int i =

0; i < files.

size()

; i++

) cv::

destroywindow

("img");

}

單目相機標定

主要 執行前需要先準備標定和記錄標定列表的文字檔案,並放入程式所在目錄下 文字檔案的內容如下 calibdata.txt 裡面填寫好需要標定的名稱 for int ii 0 iiif 0 ii cornernum 24 是每幅的角點個數。此判斷語句是為了輸出 號,便於控制台 輸出所有的角點 cout...

單目相機標定

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是指單個網格的...