opencv相机标定 arucode
时间: 2025-01-05 13:30:06 浏览: 15
### 如何使用 OpenCV 进行相机标定并使用 ArUco 码
#### 使用 OpenCV 进行相机标定
为了确保高质量的相机标定,程序会等待一段时间后再捕捉图像。这允许用户调整棋盘格的位置以获取不同视角下的多张图片[^3]。
```python
import numpy as np
import cv2
import glob
# 终止条件
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 棋盘格尺寸
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)
# 存储三维点和对应的二维点坐标
objpoints = []
imgpoints = []
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:
objpoints.append(objp)
refined_corners = cv2.cornerSubPix(
gray,
corners,
winSize=(11, 11),
zeroZone=(-1, -1),
criteria=criteria
)
imgpoints.append(refined_corners)
# 可视化检测到的角点
cv2.drawChessboardCorners(img, chessboard_size, refined_corners, ret)
cv2.imshow('Image', img)
cv2.waitKey(500)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
objpoints,
imgpoints,
gray.shape[::-1],
None,
None
)
print("Camera matrix:")
print(mtx)
print("\nDistortion coefficients:")
print(dist)
cv2.destroyAllWindows()
```
这段代码展示了如何利用 `cv::findChessboardCorners` 函数定位棋盘上的角落,并通过调用 `cv::cornerSubPix` 来提高这些位置的精度。
#### 使用 ArUco 码进行自动识别
ArUco 标记是一种特殊的二维码形式,在机器人导航等领域有着广泛应用。下面是如何配置环境以及编写简单的 Python 脚本来读取摄像头流并解析其中可能存在的 ArUco 编码:
首先安装必要的库文件:
```bash
pip install opencv-contrib-python==4.5.4
```
接着创建如下所示的 Python 文件来处理视频帧中的 ArUco 检测逻辑:
```python
import cv2
from cv2 import aruco
cap = cv2.VideoCapture(0)
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
parameters = aruco.DetectorParameters_create()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
corners, ids, rejectedImgPoints = aruco.detectMarkers(
gray,
aruco_dict,
parameters=parameters
)
detected_markers_frame = aruco.drawDetectedMarkers(frame.copy(), corners, ids)
cv2.imshow('Detected Markers', detected_markers_frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
此段代码实现了基本功能——实时捕获来自默认摄像设备的画面,并尝试从中提取任何可用的 ArUco 符号信息[^1].
阅读全文