相機(jī)校準(zhǔn)與方形棋盤

2018-10-07 09:49 更新

本教程的目標(biāo)是學(xué)習(xí)如何校準(zhǔn)一個(gè)已經(jīng)給定一套棋盤圖像的相機(jī)。

測(cè)試數(shù)據(jù):使用數(shù)據(jù)/象棋文件夾中的圖像。

  • 通過(guò)在cmake配置中將BUILD_EXAMPLES設(shè)置為ON,用OpenCV編譯樣本。
  • 轉(zhuǎn)到bin文件夾,并使用imagelist_creator創(chuàng)建圖像的XML / YAML列表。
  • 然后,運(yùn)行校準(zhǔn)樣品以獲取相機(jī)參數(shù)。使用方形尺寸等于3cm。

Pose 預(yù)估

現(xiàn)在,讓我們編寫檢測(cè)圖像中棋盤的代碼,并找到與相機(jī)的距離。您可以將此方法應(yīng)用于具有已知3D幾何的任何對(duì)象; 您在圖像中檢測(cè)到。

測(cè)試數(shù)據(jù):使用您的數(shù)據(jù)文件夾中的chess_test * .jpg圖像。

  • 創(chuàng)建一個(gè)空的控制臺(tái)項(xiàng)目。加載測(cè)試圖像:

Mat img = imread(argv [1],IMREAD_GRAYSCALE);

  • 使用findChessboard功能檢測(cè)此圖像中的棋盤:

bool found = findChessboardCorners(img,boardSize,ptvec,CALIB_CB_ADAPTIVE_THRESH);
  • 現(xiàn)在,在任何坐標(biāo)系中編寫一個(gè)生成棋盤的3d坐標(biāo)矢量<Point3f>數(shù)組的函數(shù)。為了簡(jiǎn)單起見(jiàn),我們選擇一個(gè)系統(tǒng),使得棋盤角中的一個(gè)位于原點(diǎn),而棋盤在平面z = 0
  • 從XML / YAML文件讀取相機(jī)參數(shù):
FileStorage fs( filename, FileStorage::READ );
Mat intrinsics, distortion;
fs["camera_matrix"] >> intrinsics;
fs["distortion_coefficients"] >> distortion;

  • 現(xiàn)在我們準(zhǔn)備通過(guò)運(yùn)行`solvePnP`來(lái)找到棋盤姿勢(shì)了

vector<Point3f> boardPoints;
// fill the array
...

solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix,
                     distCoeffs, rvec, tvec, false);
  • 計(jì)算重新投影錯(cuò)誤,就像在校準(zhǔn)樣品中一樣(參見(jiàn)opencv / samples / cpp / calibration.cpp,函數(shù)computeReprojectionErrors)。

問(wèn)題:你如何計(jì)算從相機(jī)原點(diǎn)到任何一個(gè)角落的距離?答:由于我們的形象在于3D空間,首先我們將計(jì)算出相對(duì)攝像機(jī)的姿勢(shì)。這將給我們3D到2D通信。接下來(lái),我們可以應(yīng)用一個(gè)簡(jiǎn)單的L2范數(shù)來(lái)計(jì)算任何點(diǎn)(拐點(diǎn)的終點(diǎn))之間的距離。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)