zoukankan      html  css  js  c++  java
  • AprilTag标记追踪

    AprilTag的种类叫家族(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

    注意:一般使用TAG36H11 

    AprilTag识别:

    代码如下:

    import sensor, image, time, math
    
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
    sensor.skip_frames(30)
    sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
    sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
    clock = time.clock()
    
    while(True):
        clock.tick()
        img = sensor.snapshot()
        for tag in img.find_apriltags(): # defaults to TAG36H11 without "families".
            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)   #输出标签的id值和摄像头旋转的角度

    运行结果:输出标签的id值和摄像头旋转的角度

    AprilTag3D定位:

    代码如下:

    import sensor, image, time, math
    
    
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
    sensor.skip_frames(30)
    sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
    sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
    clock = time.clock()
    
    
    # 注意!与find_qrcodes不同,find_apriltags 不需要软件矫正畸变就可以工作。
    
    
    # 注意,输出的姿态的单位是弧度,可以转换成角度,但是位置的单位是和你的大小有关,需要等比例换算
    
    
    # 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)
    
    
    #实际的TX、TY、TZ的值需要通过公式计算
    #Kz=实际距离(Z值)/Tz
    #之后算出每一次的实际距离=Kz*Tz
    
    
    
    
    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())

    运行结果:物体相对摄像头的(x,y,z)坐标位置,和(x,y,z)旋转角度

    建立摄像头的空间直角坐标系:

    正是步行者,一步步登峰!

  • 相关阅读:
    C# Apache Thrift Demo
    C#指针使用demo
    C#中指针使用总结
    fastjson之JSONObject、JSONArray
    fastjson使用
    ObjectMapper使用
    ObjectMapper将json转对象报错处理
    rabbitmq-channel方法介绍
    rabbitmq不同模式的交换机使用
    activemq总结
  • 原文地址:https://www.cnblogs.com/ouyangmail/p/14267457.html
Copyright © 2011-2022 走看看