You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV 4.8.1中如何估计Charuco Board位姿?求新流程示例

用OpenCV 4.8.1的solvePnP实现Charuco板位姿估计

核心逻辑

旧版estimatePoseCharucoBoard移除后,替代流程分为三步:

  1. 检测图像中的ArUco标记
  2. 从ArUco标记插值得到Charuco板的角点与对应ID
  3. 提取这些角点的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:14:57