目录
关于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跟踪标记的解析就到这里了,你学废了没有?下篇文章见!!