安装opencv-python与contrib后仍遇cv2.aruco无Dictionary_get属性错误
解决OpenCV中aruco模块的AttributeError: 找不到'Dictionary_get'属性问题
这个错误的核心原因是OpenCV版本更新导致的API不兼容:OpenCV 4.x及以后的版本对aruco模块的方法命名做了调整,旧版的Dictionary_get()和DetectorParameters()已经被废弃,换成了新的方法名。
修正后的代码
直接替换代码中对应的两行API调用即可,同时额外增加了检测结果的判断逻辑,避免未检测到标记时触发索引错误,完整修正代码如下:
import numpy as np import cv2, PIL from cv2 import aruco import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd vid = cv2.VideoCapture(0) while (True): ret, frame = vid.read() if cv2.waitKey(1) & 0xFF == ord('q'): break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 替换旧的Dictionary_get为getPredefinedDictionary aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_6X6_250) # 替换旧的DetectorParameters为DetectorParameters_create parameters = aruco.DetectorParameters_create() corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters) frame_markers = aruco.drawDetectedMarkers(frame.copy(), corners, ids) plt.figure() plt.imshow(frame_markers) if ids is not None: for i in range(len(ids)): c = corners[i][0] plt.plot([c[:, 0].mean()], [c[:, 1].mean()], "o", label = "id={0}".format(ids[i])) plt.legend() plt.show() vid.release() cv2.destroyAllWindows()
额外注意事项
- 必须保证
opencv-python和opencv-contrib-python的版本完全一致,比如都安装4.8.0.74版本,版本不匹配也会导致各种奇怪的属性错误 - 安装时尽量用同一种包管理工具,要么全用pip,要么全用conda,避免混合安装引发依赖冲突
内容的提问来源于stack exchange,提问作者Harikrishnan M
相关产品推荐
相关产品推荐

