1、相機內參
上面是一個小孔成像模型,相機的內參就是指相機座標系與像平面之間的座標轉換關係。
上式中的就是內參矩陣,爲比例參數,爲偏移參數。注意,這裏的焦距被歸一化爲1,在由像素尺度恢復到實際尺度的任務中要考慮這一點。例子
另外,在opencv
中還考慮了徑向畸變和切向畸變:
2、棋盤格標定的實現
棋盤格標定是獲取相機內參的常用方法,下面給出利用opencv
進行相機標定的代碼。
- 獲取棋盤格角點
board, corners = cv2.findChessboardCorners(gray, (CHESSBOARD_CORNERS_ROWCOUNT,CHESSBOARD_CORNERS_COLCOUNT), None)
- 亞像素細化
corners_acc = cv2.cornerSubPix(
image=gray,
corners=corners,
winSize=(11, 11),
zeroZone=(-1, -1),
criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
imgpoints.append(corners_acc)
- 計算相機內外參及畸變係數
calibration, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(
objectPoints=objpoints,
imagePoints=imgpoints,
imageSize=imageSize,
cameraMatrix=None,
distCoeffs=None)
- 計算反投影誤差(評價標定結果)
for i in range(len(objpoints)):
imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], cameraMatrix, distCoeffs)
error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
tot_error += error
mean_error = tot_error/len(objpoints)
- 圖像去畸變
img_undist = cv2.undistort(frame,cameraMatrix,distCoeffs,None)
完整代碼及測試圖像(棋盤格):https://download.csdn.net/download/weixin_38258767/12066747