opencv圆形标定
时间: 2023-12-23 14:28:12 浏览: 92
在OpenCV中,圆形标定图案可以用于相机的标定。圆形标定图案分为对称圆形和非对称圆形两种类型。使用圆形标定图案进行相机标定的步骤如下:
1. 准备标定图案:根据需要选择对称圆形或非对称圆形标定图案。可以使用OpenCV自带的例程中的imagelist_creator.cpp生成标定图像。
2. 拍摄标定图像:使用相机拍摄一系列包含标定图案的图像。确保图像中的标定图案清晰可见,并且标定图案在不同位置和角度下都有足够的变化。
3. 提取标定图案的角点:使用OpenCV的findCirclesGrid函数来检测图像中标定图案的角点。该函数会返回每个标定图案的角点坐标。
4. 标定相机:使用OpenCV的calibrateCamera函数来进行相机标定。将标定图像的角点坐标和实际世界坐标传递给该函数,它将返回相机的内参矩阵、畸变系数和旋转平移向量等标定结果。
5. 评估标定结果:可以使用reprojectionError函数来评估标定结果的准确性。该函数会计算标定图案的重投影误差,即标定图案的角点在标定结果下的重投影位置与实际位置之间的差距。
下面是一个使用对称圆形标定图案进行相机标定的示例代码:
```python
import cv2
import numpy as np
# 准备标定图案
pattern_size = (7, 7) # 标定图案的内角点个数
pattern_points = np.zeros((np.prod(pattern_size), 3), np.float32)
pattern_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2)
# 拍摄标定图像
images = [] # 存储标定图像
# 读取图像并检测角点
for i in range(1, 21):
img = cv2.imread(f'calibration_images/{i}.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findCirclesGrid(gray, pattern_size, None)
if ret:
images.append((gray, corners))
# 标定相机
obj_points = [] # 存储标定图案的实际世界坐标
img_points = [] # 存储标定图案的图像坐标
for gray, corners in images:
obj_points.append(pattern_points)
img_points.append(corners)
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
# 评估标定结果
mean_error = 0
for i in range(len(obj_points)):
img_points2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], camera_matrix, dist_coeffs)
error = cv2.norm(img_points[i], img_points2.reshape(-1, 2), cv2.NORM_L2) / len(img_points2)
mean_error += error
mean_error /= len(obj_points)
print("Mean reprojection error: ", mean_error)
```
阅读全文