openmv第三天之标记跟踪

AprilTag是一个视觉基准系统

感觉就是一个可以定位 校准帮助openmv来找到 定位的东西

官方解释的用处:简单来说,只要把这个tag贴到目标上,就可以在OpenMV上识别出这个标签的3D位置,id。

感觉用来辅助贴到目标物体,像gps一样0.0

AprilTag的种类

这个图案有不同的家,那个家庭里面有不同数目的成员,有效区域方块多的校验信息越多,那么就会越精确,但视力越低,目前还不知道此时的视力是啥。

这些是一些家对应的名称和家庭成员数目 

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

制作AprilTag

在工具中就可以制作一些图案,要设置你要的个数和属于哪个家(色块的规格)

下面是官方给出的找到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坐标,如果想得到中心的坐标,可以用初始坐标加上宽高的一半来得到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值