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