OpenCV-Python 4.8.0单标记位姿估计API报错:找不到estimatePoseSingleMarkers
OpenCV-Python 4.8.0 单ArUco标记位姿估计实现方案
在OpenCV 4.7及以上版本中,ArUco模块的API发生了拆分,原有的estimatePoseSingleMarkers函数不再直接属于cv2.aruco模块或ArucoDetector对象,而是迁移到了**cv2.aruco.PoseEstimator**类中。以下是具体实现步骤:
核心步骤
- 准备相机标定参数:内参矩阵和畸变系数(需提前通过相机标定获取)
- 初始化
PoseEstimator对象,关联对应ArUco字典与标记尺寸 - 结合检测得到的标记角点,完成位姿估计
完整代码示例
import cv2 import numpy as np # 1. 相机标定参数(替换为你的实际标定结果) camera_matrix = np.array([[1000, 0, 320], [0, 1000, 240], [0, 0, 1]], dtype=np.float32) dist_coeffs = np.zeros((4, 1), dtype=np.float32) # 若无畸变可设为零矩阵 # 2. 配置ArUco相关参数 aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) marker_size = 0.05 # 标记实际尺寸,单位:米(根据你的标记调整) # 初始化检测器与位姿估计器 detector = cv2.aruco.ArucoDetector(aruco_dict) pose_estimator = cv2.aruco.PoseEstimator(aruco_dict, camera_matrix, dist_coeffs) # 3. 读取图像并检测标记 image = cv2.imread("marker_image.jpg") corners, ids, rejected = detector.detectMarkers(image) # 4. 位姿估计与结果绘制 if len(corners) > 0: # 遍历每个检测到的标记 for i in range(len(ids)): # 估计当前标记的位姿 rvec, tvec = pose_estimator.estimatePoseSingleMarkers(corners[i], marker_size) # 绘制检测到的标记 cv2.aruco.drawDetectedMarkers(image, corners, ids) # 绘制位姿坐标轴(长度设为标记尺寸的一半) cv2.drawFrameAxes(image, camera_matrix, dist_coeffs, rvec, tvec, marker_size/2) # 显示结果 cv2.imshow("ArUco Pose Estimation", image) cv2.waitKey(0) cv2.destroyAllWindows()
关键说明
PoseEstimator的初始化必须与检测时使用的ArUco字典保持一致,否则会出现匹配错误marker_size需输入标记的实际物理尺寸(单位:米),否则位姿结果的平移向量tvec会比例失真- 若同时检测多个标记,需遍历每个角点组单独调用
estimatePoseSingleMarkers
内容的提问来源于stack exchange,提问作者M lab
相关产品推荐
相关产品推荐

