张正友标定法opencv实现
时间: 2024-12-07 13:13:27 浏览: 17
Zhang'sCameraCalibration.zip
张正友标定法是一种用于相机标定的经典方法,由张正友在1998年提出。该方法通过使用平面标定板(如棋盘格)来估计相机的内参和外参。以下是使用OpenCV实现张正友标定法的主要步骤:
1. **准备标定板**:通常使用棋盘格标定板。确保标定板上有足够的角点,以便相机能够清晰捕捉到。
2. **采集图像**:从不同角度和位置拍摄多张标定板的图像。图像数量越多,标定结果越准确。
3. **检测角点**:使用OpenCV的函数检测图像中的棋盘格角点。
4. **计算相机矩阵和畸变系数**:使用检测到的角点计算相机的内参矩阵和畸变系数。
5. **优化标定结果**:通过最小化重投影误差来优化标定结果。
以下是一个简单的OpenCV代码示例,展示了如何实现张正友标定法:
```python
import cv2
import numpy as np
import glob
# 设置棋盘格参数
chessboard_size = (9, 6)
square_size = 1.0 # 棋盘格方格的实际大小
# 准备对象点,如 (0,0,0), (1,0,0), ..., (8,5,0)
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
objp *= square_size
# 存储所有图像的对象点和图像点
objpoints = [] # 3d 点在真实世界空间
imgpoints = [] # 2d 点在图像平面
# 读取所有标定图像
images = glob.glob('calibration_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
# 如果找到角点,添加到对象点和图像点中
if ret:
objpoints.append(objp)
imgpoints.append(corners)
# 可视化角点
cv2.drawChessboardCorners(img, chessboard_size, corners, ret)
cv2.imshow('Chessboard Corners', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
print("相机内参矩阵:\n", mtx)
print("畸变系数:\n", dist)
# 保存标定结果
np.savez('calib_result.npz', mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs)
```
阅读全文