zoukankan      html  css  js  c++  java
  • openmv之ApriTag-3D定位

    AprilTag最神奇的是3D定位的功能,它可以得知Tag的空间位置,一共有6个自由度,三个位置,三个角度。

    # AprilTags Example
    #
    # This example shows the power of the OpenMV Cam to detect April Tags
    # on the OpenMV Cam M7. The M4 versions cannot detect April Tags.
    
    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)
    
    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())

    在三维坐标中是以openmv为坐标原点的

    apriltag.x_translation()

    返回距离摄像机x方向的变换,距离的单位未知。

    这个方法对于确定远离摄像机的AprilTag的位置很有用。但是,AprilTag的大小以及您使用的镜头等因素都会影响X单元归属的确定。为使用方便,我们推荐您使用查找表将该方法的输出转换为对您的应用程序有用的信息。

    注意:此处的方向为从左至右。

    您也可以通过索引 [12] 取得这个值。

    apriltag.y_translation()

    返回距离摄像机y方向的变换,距离的单位未知。

    这个方法对于确定远离摄像机的AprilTag的位置很有用。但是,AprilTag的大小以及您使用的镜头等因素都会影响Y单元归属的确定。为使用方便,我们推荐您使用查找表将该方法的输出转换为对您的应用程序有用的信息。

    注意:此处的方向为从上至下。

    您也可以通过索引 [13] 取得这个值。

    apriltag.z_translation()

    返回距离摄像机z方向的变换,距离的单位未知。

    T这个方法对于确定远离摄像机的AprilTag的位置很有用。但是,AprilTag的大小以及您使用的镜头等因素都会影响Z单元归属的确定。为使用方便,我们推荐您使用查找表将该方法的输出转换为对您的应用程序有用的信息。

    注意:此处的方向为从前至后。

    您也可以通过索引 [14] 取得这个值。

    apriltag.x_rotation()

    返回以弧度计的AprilTag在X平面上的旋度。例:目视AprilTag,从左至右移动摄像头。

    您也可以通过索引 [15] 取得这个值。

    apriltag.y_rotation()

    返回以弧度计的AprilTag在Y平面上的旋度。例:目视AprilTag,从上至下移动摄像头。

    您也可以通过索引 [16] 取得这个值。

    apriltag.z_rotation()

    返回以弧度计的AprilTag在Z平面上的旋度。例:目视AprilTag,旋转摄像头。

    注意:这只是 apriltag.rotation() 的重命名版本。

    您也可以通过索引 [17] 取得这个值。

    这些都可以在openmv的函数库中找到

    以下图像可以放大查看,在左下角串行终端中可以看到数据的变化

    对比图

    图像右移图tx为正

     图像左移图tx为副负

    图像上移图ty为正

    图像下移图ty为负

    tz都为负因为在openmv是0在其后边为正

    tag与openmv移近

    tag与openmv移远

    tag逆时针旋转

    openmv的实际距离 k =√(tx^2+ty^2+tz^2)

  • 相关阅读:
    python操作mysql
    django 模型
    sox应用实例:平分一个音频文件
    Python list的各种删除元素操作
    Python sort() 和 sorted() 的区别
    Linux去除文件名中的空格
    合并多个MP4文件
    把wav文件等时长切割
    删除文件里的重复行
    Shell 截取字符串
  • 原文地址:https://www.cnblogs.com/miaorn/p/12239047.html
Copyright © 2011-2022 走看看