• (一)DepthAI-python相关接口:OAK Device


    消息快播:OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~

    编辑:OAK中国
    首发:oakchina.cn
    喜欢的话,请多多👍⭐️✍
    内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。

    ▌前言

    Hello,大家好,这里是OAK中国,我是助手君。

    最近在知乎看到有朋友写了depthai python接口相关的内容,内容非常不错。我整理了一下,分享给大家。

    本系列一共四篇博客,原文出处:石满@知乎

    ▌Device API

    在这里插入图片描述

    import depthai as dai
    
    • 1

    Example样例

    Device对象指的是一个OAK设备。当启动一个oak设备时,会上传一个Pipeline管道,该管道会在VPU上运行,当用代码创建设备时,固件、管道和其他资源(NN blobs)会被一起上传。

    pipeline = depthai.Pipeline()
    
    # 创建节点,配置并连接他们
    
    # 上传一个管道到设备上
    with depthai.Device(pipeline) as device:
      print('MxId:',device.getDeviceInfo().getMxId()) # Myraid X id
      print('USB speed:',device.getUsbSpeed())  # usb 传输速度 
      print('Connected cameras:',device.getConnectedCameras())  # 相机
    
      # 输入队列,主机传输数据到设备
      input_q = device.getInputQueue("input_name", maxSize=4, blocking=False)
    
      # 输出队列,设备传输数据到主机
      output_q = device.getOutputQueue("output_name", maxSize=4, blocking=False)
    
      while True:
          # 获取输出队列中一条信息
          output_q.get() # Or output_q.tryGet() for non-blocking
    
          # 向设备发送一条消息
          cfg = depthai.ImageManipConfig()
          input_q.send(cfg)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Queue队列

    对设备进行初始化后,必须进行输入/输出队列的初始化,这些队列将会位于主机上。

    outputQueue = device.getOutputQueue("output_name")
    inputQueue = device.getInputQueue("input_name")
    
    • 1
    • 2

    定义一个输出队列后,设备会一直输出新的信息,主机也会一直读取它。通常情况下,主机读取队列的速度更快,导致大部分时间,队列是一个空的状态。但当主机同事在做其他程序,设备写入的速度快于主机读取的速度,在队列中的信息会增加,maxSize、blocking两个参数决定了队列的行为。

    # 初始化
    queue = device.getOutputQueue(name="name", maxSize=5, blocking=False)
    
    # Or afterwards
    queue.setMaxSize(10)
    queue.setBlocking(True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 一般情况下不需要考虑,但当主机内存很小的情况下,需要设置最大队列尺寸。 仅需要最新的结果,以前的不要紧, maxSize=1, blocking=False
    • 30fps代表一帧大约需要33ms,如果主机处理一帧在这个范围内,maxSize=1,2代表处理一帧需要66ms
    • 如对间隔内获取的数据有需要,可以进行具体设置,如DetectionNetwork网络需要检查最近1s内的结果,maxSize=30,blocking=False(假设DetectionNetwork网络处理速度为30fps)
    • blocking=True 仅当信息之间正确的顺序被需要的时候, 例如:匹配直通帧和原始帧, 编码等

    Blocking or Non-Blocking 堵塞与否

    默认情况下,maxSize=30,blocking=True。所以当设备填满一个队列,且达到上限,其他任何来自设备的消息将被堵塞,等主机处理完一个消息后,才会将新的消息输入队列。

    当blocking=False,将改变上述等待的行为,库将会丢弃最老的信息,并增加新的到队列上,继续其处理循环,maxSize决定了队列的尺寸,并会帮助控制主机内存的使用。例如一条5MB的数据,队列尺寸为30, 那么这条队列在主机中占用150MB的数据内存。

    附加信息

    • maxSize=1, blocking=False, 代表仅需要队列中的最新信息
    • 队列是线性安全,可从任何线程中访问它们
    • 队列创建时,每个队列是自己的线程,负责接受、序列化、反序列化,传输信息
    • Device对象不是完全的线程安全

    ▌参考资料

    https://docs.oakchina.cn/en/latest/
    https://www.oakchina.cn/selection-guide/


    OAK中国
    | OpenCV AI Kit在中国区的官方代理商和技术服务商
    | 追踪AI技术和产品新动态

    戳「+关注」获取最新资讯↗↗

  • 相关阅读:
    Android学习笔记 25. Activity与Fragment通信
    Java新手小白入门篇 Java面向对象(九)
    数据结构——二叉搜索树的实现、删除(最大值和最小值、最大值和最小值)
    【人工智能 & 机器学习 & 深度学习】基础选择题1~30题 练习
    会议OA(会议排座&送审)
    docker save与docker export的区别
    XDOJ-360 结点在二叉排序树的位置
    uniapp(uncloud) 使用生态开发接口详情1(创建项目)
    arm代码
    学信息系统项目管理师第4版系列31_信息系统工程
  • 原文地址:https://blog.csdn.net/oakchina/article/details/128093736