Python 利用棋盘格进行相机标定
时间: 2024-02-03 21:03:09 浏览: 120
A4棋盘格用于相机标定
相机标定是指确定相机的内部参数(如焦距、主点位置等)和外部参数(如旋转矩阵、平移向量等),以便在三维空间中精确地测量物体的位置和大小。利用棋盘格进行相机标定是一种常用的方法。
下面是Python中使用OpenCV库进行棋盘格标定的步骤:
1. 采集棋盘格图像
首先在棋盘格上贴上黑白相间的方块,然后使用相机拍摄这个棋盘格的多个角度的图像。注意拍摄时棋盘格应该保持平整,光线应该充足并且均匀。
2. 检测棋盘格角点
使用OpenCV中的cv2.findChessboardCorners()函数来检测棋盘格角点。该函数会返回一个布尔值和一个角点数组。如果找到了角点,则布尔值为True,否则为False。角点数组包含了所有检测到的角点的坐标。
3. 标定相机
将检测到的角点坐标传递给cv2.calibrateCamera()函数进行相机标定。该函数会返回相机的内部参数(如相机矩阵、畸变系数等)和外部参数(如旋转矩阵、平移向量等)。
4. 优化标定结果
使用cv2.undistort()函数将图像进行校正,以获得更好的结果。
下面是完整的Python代码示例:
```python
import numpy as np
import cv2
# 定义棋盘格大小
chessboard_size = (9, 6)
# 准备棋盘格图像
objp = np.zeros((np.prod(chessboard_size), 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
obj_points = []
img_points = []
# 读取棋盘格图像
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 == True:
obj_points.append(objp)
img_points.append(corners)
# 在图像中绘制角点
cv2.drawChessboardCorners(img, chessboard_size, corners, ret)
# 显示当前图像
cv2.imshow('img', img)
cv2.waitKey(500)
# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
# 优化标定结果
img = cv2.imread('calibration_images/1.jpg')
h, w = img.shape[:2]
new_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# 显示校正后的图像
dst = cv2.undistort(img, mtx, dist, None, new_mtx)
cv2.imshow('dst', dst)
cv2.waitKey(0)
# 保存标定结果
np.savez('calibration.npz', ret=ret, mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs)
```
该代码将棋盘格图像存放在calibration_images文件夹中。在运行脚本之后,程序会依次显示每个棋盘格图像,并在图像中绘制出检测到的角点。最后,程序会将标定结果保存在calibration.npz文件中,并显示校正后的第一张图像。
阅读全文