相机标定的实现

1、相机内参

小孔成像
上面是一个小孔成像模型,相机的内参就是指相机坐标系与像平面之间的坐标转换关系。
[ x y 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X c Y c 1 ] = K [ X c Y c 1 ] \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}
上式中的 K K 就是内参矩阵, f x , f y f_x,f_y 为比例参数, c x , c y c_x,c_y 为偏移参数。注意,这里的焦距被归一化为1,在由像素尺度恢复到实际尺度的任务中要考虑这一点。例子

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

发布了57 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_38258767/article/details/103775017