感觉就是一个可以定位 校准帮助openmv来找到 定位的东西
官方解释的用处:简单来说,只要把这个tag贴到目标上,就可以在OpenMV上识别出这个标签的3D位置,id。
感觉用来辅助贴到目标物体,像gps一样0.0
这个图案有不同的家,那个家庭里面有不同数目的成员,有效区域方块多的校验信息越多,那么就会越精确,但视力越低,目前还不知道此时的视力是啥。
这些是一些家对应的名称和家庭成员数目
TAG16H5 → 0 to 29
TAG25H7 → 0 to 241
TAG25H9 → 0 to 34
TAG36H10 → 0 to 2319
TAG36H11 → 0 to 586
ARTOOLKIT → 0 to 511
在工具中就可以制作一些图案,要设置你要的个数和属于哪个家(色块的规格)
下面是官方给出的找到buffer中的a图案 框出返回角度值
注意这里引入了math模块这里可以使用pi值
import sensor, image, time, math
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(30)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
//在find图案的时候也需要关闭增益和白平衡
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
for tag in img.find_apriltags(): #这里使用函数找全buffer里面的图案
img.draw_rectangle(tag.rect(), color = (255, 0, 0))
img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
degress = 180 * tag.rotation() / math.pi#返回的幅度值,这样可以计算角度值
print(tag.id(),degress)#打印出角度值
下面则是3d定位xyz和旋转角的find
import sensor, image, time, math
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
clock = time.clock()
# f_x 是x的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/3.984*656,这个值是用毫米为单位的焦距除以x方向的感光元件的长度,乘以x方向的感光元件的像素(OV7725)
# f_y 是y的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/2.952*488,这个值是用毫米为单位的焦距除以y方向的感光元件的长度,乘以y方向的感光元件的像素(OV7725)
# c_x 是图像的x中心位置
# c_y 是图像的y中心位置
f_x = (2.8 / 3.984) * 160 # 默认值
f_y = (2.8 / 2.952) * 120 # 默认值
c_x = 160 * 0.5 # 默认值(image.w * 0.5)
c_y = 120 * 0.5 # 默认值(image.h * 0.5)
def degrees(radians):
return (180 * radians) / math.pi
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): # 默认为TAG36H11
img.draw_rectangle(tag.rect(), color = (255, 0, 0))
img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
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())
这里我学到了python的打印的技巧,我可以用一个args列表存下我想打印的所有信息,然后再打印出来就很吊感觉,很有条理。
还有其中的f_x和f_y也要改是感光元件的特征值 cx,cy要改 0,是整个图像的中心位置,因为不同图像的中心位置不一样嘛这个需要改一下。我猜测这两个数据应该和后面的定位有关,所以才需要传入这两个参数。
tags = img.find_apriltags():这样表达是不允许的,会报错,所以这个只能用for tag in 这个函数来使用,后来查了这个函数的返回值,他返回回来的是查找的Apriltag的一些指标,将这些指标赋值给tags,直接调用tag的某个特定值。也可以直接通过索引来获取他其中的值。find无论是色块还是Apriltag,返回来都是许许多多这个画面找到的目标,你将其赋值给一个blobs,这还是一个含有你想要的很多个目标的列表,你用for a in blobs 里面去遍历所有的blobs的参数,是这样的。所以你用一个tag赋值了,然后直接使用tag[5]这样是不行,因为他不知道是哪一个啊~
而且这个是可以检测多个的Apriltag的!可以显示多个框框
点头是x轴的旋转 摇头是y的旋转 歪脖子是z的旋转
返回的的TX TY TZ 是虚拟距离 但是和实际的距离有一点的关系,这样我们可以寻找出这个比例关系。
面积的值可以用函数的长宽来乘得到面积值,rect矩形返回来的是初始的xy坐标,如果想得到中心的坐标,可以用初始坐标加上宽高的一半来得到。