OpenCV 4.8.1中如何估计Charuco Board位姿?求新流程示例
用OpenCV 4.8.1的solvePnP实现Charuco板位姿估计
核心逻辑
旧版estimatePoseCharucoBoard移除后,替代流程分为三步:
- 检测图像中的ArUco标记
- 从ArUco标记插值得到Charuco板的角点与对应ID
- 提取这些角点的3D世界坐标和2D图像坐标,用
solvePnP计算位姿
可运行Python示例
import cv2 import numpy as np # 配置Charuco板参数 CHARUCO_ROWS = 5 CHARUCO_COLS = 7 ARUCO_DICT = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) # 参数:(棋盘格尺寸, 方格边长, ArUco标记边长, 字典) charuco_board = cv2.aruco.CharucoBoard((CHARUCO_COLS, CHARUCO_ROWS), 0.03, 0.02, ARUCO_DICT) # 相机内参和畸变系数(需替换为实际标定结果) camera_matrix = np.array([[1000, 0, 320], [0, 1000, 240], [0, 0, 1]], dtype=np.float32) dist_coeffs = np.zeros((5, 1), dtype=np.float32) # 读取目标图像 img = cv2.imread("charuco_sample.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 第一步:检测ArUco标记 corners, ids, rejected = cv2.aruco.detectMarkers(gray, ARUCO_DICT) if len(corners) > 0: # 第二步:插值得到Charuco角点 ret, charuco_corners, charuco_ids = cv2.aruco.interpolateCornersCharuco( corners, ids, gray, charuco_board ) # 至少需要4个点才能计算位姿 if ret > 3: # 准备3D世界坐标(Charuco板默认在Z=0平面) obj_points = [] for charuco_id in charuco_ids.flatten(): obj_pt = charuco_board.getChessboardCorners()[charuco_id] obj_points.append(obj_pt) obj_points = np.array(obj_points, dtype=np.float32) # 准备2D图像坐标 img_points = charuco_corners.astype(np.float32) # 第三步:用solvePnP计算位姿 success, rvec, tvec = cv2.solvePnP( obj_points, img_points, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_IPPE_SQUARE ) if success: # 绘制坐标轴(长度0.1米) cv2.drawFrameAxes(img, camera_matrix, dist_coeffs, rvec, tvec, 0.1) print("旋转向量:\n", rvec) print("平移向量:\n", tvec) # 显示结果 cv2.imshow("Charuco Pose", img) cv2.waitKey(0) cv2.destroyAllWindows()
关键注意事项
- 相机标定:示例中的
camera_matrix和dist_coeffs是模拟值,必须替换为你自己相机的实际标定结果,否则位姿计算会严重失真。 - 参数匹配:
CharucoBoard构造时的方格边长、标记边长单位要统一(示例用米),后续绘制坐标轴的长度单位也要对应。 - 求解方法:
solvePnP的flags参数可选不同算法,比如SOLVEPNP_IPPE_SQUARE适合平面目标(Charuco板是平面),精度更高。
OpenCV最新文档查询
OpenCV 4.x的Charuco相关接口都在cv2.aruco模块下,你可以通过以下方式获取官方文档:
- 在Python环境中直接调用
help()函数查看函数细节,比如help(cv2.aruco.interpolateCornersCharuco)、help(cv2.solvePnP)。 - 本地安装的OpenCV附带完整文档,通常在安装目录的
doc文件夹中,可直接打开html文件浏览。
内容的提问来源于stack exchange,提问作者lchavez
相关产品推荐
相关产品推荐

