相機標定的實現

1、相機內參

小孔成像
上面是一個小孔成像模型,相機的內參就是指相機座標系與像平面之間的座標轉換關係。
[xy1]=[fx0cx0fycy001][XcYc1]=K[XcYc1] \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} f_x &&0&&c_x \\ 0&&f_y &&c_y\\ 0&&0&&1 \end{bmatrix} \begin{bmatrix} X_c \\ Y_c \\ 1 \end{bmatrix}=K\begin{bmatrix} X_c \\ Y_c \\ 1 \end{bmatrix}
上式中的KK就是內參矩陣,fx,fyf_x,f_y爲比例參數,cx,cyc_x,c_y爲偏移參數。注意,這裏的焦距被歸一化爲1,在由像素尺度恢復到實際尺度的任務中要考慮這一點。例子
另外,在opencv中還考慮了徑向畸變和切向畸變:
在這裏插入圖片描述

2、棋盤格標定的實現

棋盤格標定是獲取相機內參的常用方法,下面給出利用opencv進行相機標定的代碼。

  1. 獲取棋盤格角點
board, corners = cv2.findChessboardCorners(gray, (CHESSBOARD_CORNERS_ROWCOUNT,CHESSBOARD_CORNERS_COLCOUNT), None)
  1. 亞像素細化
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)
  1. 計算相機內外參及畸變係數
calibration, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(
        objectPoints=objpoints,
        imagePoints=imgpoints,
        imageSize=imageSize,
        cameraMatrix=None,
        distCoeffs=None)
  1. 計算反投影誤差(評價標定結果)
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)
  1. 圖像去畸變
img_undist = cv2.undistort(frame,cameraMatrix,distCoeffs,None)

完整代碼及測試圖像(棋盤格):https://download.csdn.net/download/weixin_38258767/12066747

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章