ArUco标记按序识别问题:Python实现下的需求与困惑
ArUco标记识别顺序与单标记识别问题解答
问题描述
是否可以按特定顺序识别ArUco标记,或仅识别单个ArUco标记?
核心需求
通过摄像头识别ArUco标记,在三个标记间绘制折线,但当前标记识别顺序随视角顺时针变化导致坐标波动,线条来回跳动。
已尝试方案
- 使用不同字典的ArUco单独识别目标图形
- 尝试通过ID识别ArUco但未成功
资料指引
单标记识别实现方向
- OpenCV ArUco模块支持精准筛选单个标记:在完成标记识别后,遍历返回的
ids与corners数组,匹配目标ID即可提取对应标记的坐标数据;也可通过配置识别参数,提前过滤非目标ID的标记。 - 关键逻辑:
detectMarkers返回的ids和corners是索引一一对应的,每个索引位置对应同一个标记的ID和角点信息,只需匹配目标ID就能锁定单个标记。
固定顺序绘制折线方向
- 基于ID映射固定顺序:为三个标记分配唯一固定ID(如ID 0、1、2),识别后按预设的ID顺序(如0→1→2)提取对应坐标,再依次绘制折线,完全不受识别顺序影响。
- 基于空间坐标排序:若无法依赖ID,可计算每个标记的中心坐标,按自定义空间规则排序(如X轴从左到右、Y轴从上到下,或指定的顺时针/逆时针逻辑),排序后再绘制线条。
OpenCV ArUco核心知识点
detectMarkers函数的返回值中,ids数组的每个元素对应corners数组同索引位置的标记角点,二者严格一一对应。- 可使用
cv.aruco.drawDetectedMarkers函数在画面上标注出每个标记的ID,便于验证识别结果的正确性。
用户提供的尝试代码
import cv2 as cv import numpy as np cap = cv.VideoCapture(1) aruco_dic = cv.aruco.Dictionary_get(cv.aruco.DICT_4X4_50) while True: ret ,frame = cap.read() fr_gr = cv.cvtColor(frame,cv.COLOR_BGRA2GRAY) corner, ids, _ = cv.aruco.detectMarkers(fr_gr,aruco_dic,ids=2) lis =[ids,corner] try: if lis[0][1] == 2: cnt = lis[1][1] x, y, h, w = cv.boundingRect(cnt) cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) elif lis[0][0] == 2: cnt = lis[1][0] x, y, h, w = cv.boundingRect(cnt) cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) else:pass except:pass cv.imshow("bild1", frame) if cv.waitKey(1) == ord("q"): break cap.release() cv.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Shkolo
相关产品推荐
相关产品推荐

