【手拉手 带你准备电赛】April Tag标记跟踪(3D定位)详解

目录

关于April Tag

April Tag介绍

April Tag分类

April Tag标记跟踪原理

April Tag标记跟踪代码分析

April Tag标记跟踪测试结果

相关内容解惑

梯度图像


关于April Tag

April Tag介绍

        April Tag是密歇根大学Edwin Olson教授及其实验团队率先提出的一种标记识别算法,现广泛运用到机器人和无人机的视觉导航中。

April Tag分类

April Tag的种类家族(family)有以下几种:

TAG16H5 → 0 to 29
TAG25H7 → 0 to 241
TAG25H9 → 0 to 34
TAG36H10 → 0 to 2319
TAG36H11 → 0 to 586
ARTOOLKIT → 0 to 511

April Tag标记跟踪原理

1.当场景中出现Tag时,会首先求出场景图象的梯度图像;

2.然后提取场景中的直线,检测方形角点;

3.然后得到突刺昂的方形区域以及关键角点,将方形区域同态映射为正方形;

4.将映射的正方形与Tags库进行匹配,判断是否为Tags;

5.然后根据相机的成像原理,根据相机焦距、Tag的尺寸计算出相机坐标系下的三维坐标(openmv会生成一个以自身为坐标原点的三维坐标系);

6.这样就实现了确定Tags的位置。

April Tag标记跟踪代码分析

1.首先我们要加如我们使用的函数库(在本项目中,我们使用到了math sensor time image)。

import sensor, image, time, math

2.然后我们需要进行感光元件的初始化,以及基本参数的设置。

#初始化相机传感器
sensor.reset()
#设置相机模块的色素模式
sensor.set_pixformat(sensor.RGB565)
#设置相机模块帧的大小
sensor.set_framesize(sensor.QQVGA)
#使用n个快照,使相机图像在改变相机设置之后稳定下来(为保证图片的质量,跳过前面的n张照片)
sensor.skip_frames(30)
#关闭自动增长
sensor.set_auto_gain(False)  
#关闭白平衡
sensor.set_auto_whitebal(False) 
clock = time.clock()

 3.由于我们输出的旋转量信息为角度,所以我们需要编写一个弧度制与角度制的转换函数。


def degrees(radians):
    return (180*radians)/math.pi

4. 然后我们需要设置一些关于相机、图片有关的参数。

#x以像素为单位的焦距
f_x = (2.8 / 3.984) * 160 
#y以像素为单位的焦距
f_y = (2.8 / 2.952) * 120 
#图像中心的x位置
c_x = 160 * 0.5
#图像中心的y位置
c_y = 120 * 0.5 

4.然后我们进行程序主要部分的编写——捕获April Tag,并且输出相关的位置信息(虽然,跟踪Tags的位置信息使用到了矩阵的运算,稍有复杂,但是在这里我们直接调用相关函数就好,并不需要对底层原理过多纠结,感谢封装底层代码的人!!!谢谢您!!!你是我的神!!!!) 。

while(True):
    #设置时钟
    clock.tick()
    #捕获图片
    img = sensor.snapshot()
    #对捕获的图片进行遍历处理
    for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): 
        #将捕获的Tag框出
        img.draw_rectangle(tag.rect(), color = (255, 0, 0))
        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))

        #输出Tag的相关信息
        #为变量复制,定义一个数据信息的大变量,来简化下面的输出函数
        print_args = (tag.x_translation(), tag.y_translation(), tag.z_translation(), \
            degrees(tag.x_rotation()), degrees(tag.y_rotation()),degrees(tag.z_rotation()))
        
        print("Tx: %f, Ty %f, Tz %f, Rx %f, Ry %f, Rz %f" % print_args)
    #将相机的帧率输出
    print(clock.fps())

April Tag标记跟踪测试结果

从下图可以看出来,我们的程序可以将Tag的位置信息打印出来,并且输出帧率。

【手拉手 带你准备电赛】April Tag标记跟踪(3D定位)详解_第1张图片

相关内容解惑

梯度图像

        图像梯度是指图像的强度或者颜色的方向变化。我们可以把图像看作一个离散的函数,那么我们的梯度图像就是对图像(离散函数)的边缘求导。

        好啦,今天关于April Tag跟踪标记的解析就到这里了,你学废了没有?下篇文章见!!

你可能感兴趣的:(OPENMV,python,计算机视觉,目标检测)