OpenCV Python中实现Aruco标记位姿估计及解决属性错误
解决OpenCV 4.7.0中Aruco标记位姿估计的属性错误
错误原因
OpenCV 4.7.0版本中,cv2.aruco.estimatePoseSingleMarkers函数已被移除,需要使用新的API实现位姿估计。同时你提供的代码存在缩进错误,这也会导致运行异常。
解决方案
以下是两种可行的修改方案:
方案1:使用cv2.aruco.PoseEstimator类
这是OpenCV推荐的新方式,专门用于Aruco标记的位姿估计:
import cv2 # 初始化Aruco字典和参数 arucoDict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250) arucoParams = cv2.aruco.DetectorParameters() # 初始化位姿估计器并设置相机参数 pose_estimator = cv2.aruco.PoseEstimator(arucoDict, arucoParams) pose_estimator.setCameraParameters(mtx, dist) # 处理帧 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) detector = cv2.aruco.ArucoDetector(arucoDict, arucoParams) corners, ids, rejected = detector.detectMarkers(gray) if len(corners) > 0: for i in range(len(ids)): # 估计单个标记位姿,0.02为标记实际尺寸(米) rvec, tvec = pose_estimator.estimateSingleMarkerPose(corners[i], marker_size=0.02) # 绘制坐标系 cv2.drawFrameAxes(frame, mtx, dist, rvec, tvec, 0.02)
方案2:直接使用cv2.solvePnP函数
如果不想用PoseEstimator,也可以调用基础位姿估计函数手动实现:
import cv2 import numpy as np # 初始化Aruco字典和参数 arucoDict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250) arucoParams = cv2.aruco.DetectorParameters() # 定义标记的3D参考点(Z=0平面,尺寸0.02米) marker_size = 0.02 obj_points = np.array([ [-marker_size/2, -marker_size/2, 0], [marker_size/2, -marker_size/2, 0], [marker_size/2, marker_size/2, 0], [-marker_size/2, marker_size/2, 0] ], dtype=np.float32) # 处理帧 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) detector = cv2.aruco.ArucoDetector(arucoDict, arucoParams) corners, ids, rejected = detector.detectMarkers(gray) if len(corners) > 0: for i in range(len(ids)): # 获取标记2D角点 img_points = corners[i].reshape(4, 2).astype(np.float32) # 估计位姿 success, rvec, tvec = cv2.solvePnP(obj_points, img_points, mtx, dist) if success: # 绘制坐标系 cv2.drawFrameAxes(frame, mtx, dist, rvec, tvec, 0.02)
注意事项
- 确保相机内参
mtx和畸变参数dist是通过相机标定得到的准确值,否则位姿估计结果会偏差。 - 原代码中
for循环下的语句缺少缩进,修改后的代码已修正该问题。 marker_size需设置为你使用的Aruco标记的实际物理尺寸(单位:米)。
内容的提问来源于stack exchange,提问作者Brandon Pillay
相关产品推荐
相关产品推荐

