Aruco标识码在视频检测中的应用

Aruco标识码在视频检测中的应用

在许多计算机视觉应用程序中,姿势估计非常重要:机器人导航,增强现实等等。 该过程基于发现真实环境中的点与其2d图像投影之间的对应关系。 这通常是一个困难的步骤,因此通常使用合成或基准标记来简化操作。

最受流行的方法之一是使用二进制方形基准标记。 这些标记的主要优点是单个标记可提供足够的对应关系(四个角)来获得相机的姿势。 而且,内部二进制编码使它们特别强大,从而允许应用错误检测和纠正技术。

与AprilTags相似,ArUco标记是计算机视觉算法可以轻松检测到的2D二进制模式。

通常,我们将AprilTags和ArUco标记用于:

  • 相机校准
  • 物体尺寸估算
  • 测量相机和物体之间的距离
  • 3D位置
  • 目标对象方向检测
  • 机器人与自主导航
    等等
image

0.Aruco码

ArUco标记是一个合成的正方形标记,由宽的黑色边框和确定其标识符(id)的内部二进制矩阵组成。 黑色边框有助于其在图像中的快速检测,并且二进制编码允许其识别以及错误检测和纠正技术的应用。 标记大小决定内部矩阵的大小。 例如,标记大小4x4由16位组成。

Aruco码例子
  • Aruco码种类

    ARUCO_DICT = {
         "DICT_4X4_50": cv2.aruco.DICT_4X4_50,
         "DICT_4X4_100": cv2.aruco.DICT_4X4_100,
         "DICT_4X4_250": cv2.aruco.DICT_4X4_250,
         "DICT_4X4_1000": cv2.aruco.DICT_4X4_1000,
         "DICT_5X5_50": cv2.aruco.DICT_5X5_50,
         "DICT_5X5_100": cv2.aruco.DICT_5X5_100,
         "DICT_5X5_250": cv2.aruco.DICT_5X5_250,
         "DICT_5X5_1000": cv2.aruco.DICT_5X5_1000,
         "DICT_6X6_50": cv2.aruco.DICT_6X6_50,
         "DICT_6X6_100": cv2.aruco.DICT_6X6_100,
         "DICT_6X6_250": cv2.aruco.DICT_6X6_250,
         "DICT_6X6_1000": cv2.aruco.DICT_6X6_1000,
         "DICT_7X7_50": cv2.aruco.DICT_7X7_50,
         "DICT_7X7_100": cv2.aruco.DICT_7X7_100,
         "DICT_7X7_250": cv2.aruco.DICT_7X7_250,
         "DICT_7X7_1000": cv2.aruco.DICT_7X7_1000,
         "DICT_ARUCO_ORIGINAL": cv2.aruco.DICT_ARUCO_ORIGINAL,
         "DICT_APRILTAG_16h5": cv2.aruco.DICT_APRILTAG_16h5,
         "DICT_APRILTAG_25h9": cv2.aruco.DICT_APRILTAG_25h9,
         "DICT_APRILTAG_36h10": cv2.aruco.DICT_APRILTAG_36h10,
         "DICT_APRILTAG_36h11": cv2.aruco.DICT_APRILTAG_36h11
     }
    
    

这些词典中的大多数遵循特定的命名约定cv2.aruco.DICT_NxN_M,其大小为NxN,后跟一个整数M,但这些值是什么意思?

  • NxN值是ArUco标记的2D位大小。 例如,对于6×6标记,我们总共有36位。
  • 网格大小后的整数M指定可以使用该词典生成的唯一ArUco ID的总数。
  • 为了使命名约定更加具体,请考虑以下示例:
    cv2.aruco.DICT_4X4_50值表示我们要生成一个二进制4×4正方形AruCo标记。 使用该词典,我们将能够生成50个唯一的ArUco标记ID。
    值cv2.aruco.DICT_7X7_250表示我们将创建一个7×7二进制ArUco标记,并且词典中将有250个唯一的ArUco标记ID。

1. 生成aruco码

明白了上边的道理,下面我们使用代码生成需要的aruco码.

arucoDict 是上边的字典
id 是ArUco ID
比如我们使用 "DICT_5X5_50",生产一个id是24的aruco码.

arucoDict = "DICT_5X5_50"
id = 24

tag = np.zeros((300, 300, 1), dtype="uint8")
cv2.aruco.drawMarker(arucoDict, id, 300, tag, 1)


cv2.imwrite("mycode.jpg", tag)
cv2.imshow("ArUCo Tag", tag)
cv2.waitKey(0)

image

看代码还是很简单的,aruco库已经整合到opencv的库里了,直接可以使用.

2. 检测识别aruco码

识别aruco码标识还是比较方便的,opencv的aruco lib已将集成了函数.


image

通过cv2.aruco子模块,使用OpenCV检测ArUco标记的过程分为三个步骤:

  • 步骤#1:使用cv2.aruco.Dictionary_get函数获取我们正在使用的ArUco标记字典。
  • 步骤#2:使用cv2.aruco.DetectorParameters_create定义ArUco检测参数。
  • 步骤#3:通过cv2.aruco.detectMarkers函数执行ArUco标记检测。
# load the input image from disk and resize it
print("[INFO] loading image...")
image = cv2.imread(args["image"])
image = imutils.resize(image, width=600)
# verify that the supplied ArUCo tag exists and is supported by
# OpenCV
if ARUCO_DICT.get(args["type"], None) is None:
    print("[INFO] ArUCo tag of '{}' is not supported".format(
        args["type"]))
    sys.exit(0)
# load the ArUCo dictionary, grab the ArUCo parameters, and detect
# the markers
print("[INFO] detecting '{}' tags...".format(args["type"]))
arucoDict = cv2.aruco.Dictionary_get(ARUCO_DICT[args["type"]])
arucoParams = cv2.aruco.DetectorParameters_create()
(corners, ids, rejected) = cv2.aruco.detectMarkers(image, arucoDict,
    parameters=arucoParams)
    
    
# verify *at least* one ArUco marker was detected
if len(corners) > 0:
    # flatten the ArUco IDs list
    ids = ids.flatten()
    # loop over the detected ArUCo corners
    for (markerCorner, markerID) in zip(corners, ids):
        # extract the marker corners (which are always returned in
        # top-left, top-right, bottom-right, and bottom-left order)
        corners = markerCorner.reshape((4, 2))
        (topLeft, topRight, bottomRight, bottomLeft) = corners
        # convert each of the (x, y)-coordinate pairs to integers
        topRight = (int(topRight[0]), int(topRight[1]))
        bottomRight = (int(bottomRight[0]), int(bottomRight[1]))
        bottomLeft = (int(bottomLeft[0]), int(bottomLeft[1]))
        topLeft = (int(topLeft[0]), int(topLeft[1]))
        
        
        # draw the bounding box of the ArUCo detection
        cv2.line(image, topLeft, topRight, (0, 255, 0), 2)
        cv2.line(image, topRight, bottomRight, (0, 255, 0), 2)
        cv2.line(image, bottomRight, bottomLeft, (0, 255, 0), 2)
        cv2.line(image, bottomLeft, topLeft, (0, 255, 0), 2)
        # compute and draw the center (x, y)-coordinates of the ArUco
        # marker
        cX = int((topLeft[0] + bottomRight[0]) / 2.0)
        cY = int((topLeft[1] + bottomRight[1]) / 2.0)
        cv2.circle(image, (cX, cY), 4, (0, 0, 255), -1)
        # draw the ArUco marker ID on the image
        cv2.putText(image, str(markerID),
            (topLeft[0], topLeft[1] - 15), cv2.FONT_HERSHEY_SIMPLEX,
            0.5, (0, 255, 0), 2)
        print("[INFO] ArUco marker ID: {}".format(markerID))
        # show the output image
        cv2.imshow("Image", image)
        cv2.waitKey(0)


    

image

3.应用

我们使用aruco标识码,做了一个小测试.

  • 标识码识别
aruco.gif
  • 安全帽ID识别
aruco2.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容