opencv 相机标定角点检测代码
时间: 2023-09-01 11:07:58 浏览: 105
以下是使用 OpenCV 进行相机标定的角点检测代码,其中假设使用的棋盘格为 9x6 的:
```python
import numpy as np
import cv2
# 棋盘格尺寸(单位:毫米)
CHESSBOARD_SQUARE_SIZE = 20
# 棋盘格大小
CHESSBOARD_SIZE = (9, 6)
# 获取棋盘格角点
def get_chessboard_corners(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, CHESSBOARD_SIZE, None)
if ret:
corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
return ret, corners
# 读取一组图片进行标定
def calibrate_camera(images):
# 预期的标定角点数量
expected_corners_count = CHESSBOARD_SIZE[0] * CHESSBOARD_SIZE[1]
# 准备用于标定的数据
object_points = []
image_points = []
# 准备物体坐标系中的点
objp = np.zeros((expected_corners_count, 3), np.float32)
objp[:, :2] = np.mgrid[0:CHESSBOARD_SIZE[0], 0:CHESSBOARD_SIZE[1]].T.reshape(-1, 2) * CHESSBOARD_SQUARE_SIZE
# 遍历每张图片进行处理
for image in images:
# 获取角点
ret, corners = get_chessboard_corners(image)
if not ret:
continue
# 确保找到了预期数量的角点
if len(corners) != expected_corners_count:
continue
# 保存物体坐标系中的点和图像平面中的点
object_points.append(objp)
image_points.append(corners)
# 进行相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, images[0].shape[:2], None, None)
return ret, mtx, dist, rvecs, tvecs
```
这段代码首先定义了棋盘格的尺寸和大小,然后定义了 `get_chessboard_corners` 函数用于获取图像中的棋盘格角点。这里使用了 OpenCV 的 `findChessboardCorners` 方法来找到棋盘格,然后使用 `cornerSubPix` 方法对角点进行亚像素级别的精确化处理。
接下来定义了 `calibrate_camera` 函数来进行相机标定。这个函数首先准备了用于标定的数据,包括物体坐标系中的点和图像平面中的点。然后遍历输入的图片,使用 `get_chessboard_corners` 函数获取角点,并且将找到的角点保存到物体坐标系中的点和图像平面中的点中。最后使用 `calibrateCamera` 方法进行相机标定,得到相机的内参和外参。
阅读全文