相機校準與方形棋盤

2018-10-07 09:49 更新

本教程的目標是學習如何校準一個已經(jīng)給定一套棋盤圖像的相機。

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

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

Pose 預估

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

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

  • 創(chuàng)建一個空的控制臺項目。加載測試圖像:

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

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

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

  • 現(xiàn)在我們準備通過運行`solvePnP`來找到棋盤姿勢了

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號