此页面由 AI 自动翻译。查看英文原版

本页目录

  • v3 API 中的新增功能
  • 所需的最小更改
  • 快速移植:简单的 RGB 流示例
  • 将旧的
  • v2 示例
  • v3 等效项:

DepthAI V3 移植指南

本文档描述了 DepthAI v2 和 v3 API 之间的变化以及如何迁移现有代码。

v3 API 中的新增功能

  • 不再需要显式创建 XLink 节点 - XLink “桥接”会自动创建。
  • 主机节点 - 现在可以在设备端节点上干净地运行主机节点。
  • 自定义主机节点 - 用户可以创建在主机上运行的自定义节点
    • 支持 ThreadedHostNodeHostNode
    • ThreadedHostNode 的工作方式类似于 ScriptNode;用户指定一个在单独线程中执行的 run 函数。
    • HostNode 公开一个输入映射 inputs,其条目会隐式同步。
    • 支持 Python 和 C++。
  • 录制和回放节点。
  • Pipeline 现在有一个可以在创建管道期间查询的实时设备。
  • 支持新的模型库
  • ImageManip 的 API 已更新,行为定义更清晰。
  • ColorCameraMonoCamera 已弃用,推荐使用新的 Camera 节点。

所需的最小更改

  • 删除显式创建 dai.Device(除非您有意通过管道构造函数传递实时设备句柄 - 这种情况很少见)。
  • 删除显式 XLink 节点。
  • dai.Device(pipeline) 替换为 pipeline.start()
  • 将任何 .getOutputQueue() 调用替换为 output.createOutputQueue()
  • 将任何 .getInputQueue() 调用替换为 input.createInputQueue()

快速移植:简单的 RGB 流示例

下面,旧的 v2 代码用 # ORIG 注释,新的代码用 # NEW 注释。
Python
1#!/usr/bin/env python3
2
3import cv2
4import depthai as dai
5
6# 创建管道
7pipeline = dai.Pipeline()
8
9# 定义源和输出
10camRgb = pipeline.create(dai.node.ColorCamera)
11
12# ORIG – v3 中已移除显式 XLink
13# xoutVideo = pipeline.create(dai.node.XLinkOut)
14# xoutVideo.setStreamName("video")
15
16# 属性
17camRgb.setBoardSocket(dai.CameraBoardSocket.CAM_A)
18camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
19camRgb.setVideoSize(1920, 1080)
20
21# 链接
22# ORIG
23# camRgb.video.link(xoutVideo.input)
24# NEW – 直接从节点创建输出队列
25videoQueue = camRgb.video.createOutputQueue()
26
27# ORIG – 整个 `with dai.Device` 块已移除
28# with dai.Device(pipeline) as device:
29#   video = device.getOutputQueue(name="video", maxSize=1, blocking=False)
30#   while True:
31# NEW – 启动管道
32pipeline.start()
33while pipeline.isRunning():
34    videoIn = videoQueue.get()  # 阻塞
35    cv2.imshow("video", videoIn.getCvFrame())
36    if cv2.waitKey(1) == ord('q'):
37        break
这将在 RVC2 设备上运行。请注意,ColorCamera/MonoCamera 节点在 RVC4 上已弃用;请参阅下一节以使用 Camera

ColorCamera / MonoCamera 用法移植到 Camera

新的 Camera 节点可以根据您的请求公开任意数量的输出。
Python
1camRgb = pipeline.create(dai.node.ColorCamera)
2camRgb.setPreviewSize(300, 300)
3camRgb.setInterleaved(False)
4camRgb.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB)
5outputQueue = camRgb.preview.createOutputQueue()
变为
Python
1camRgb = pipeline.create(dai.node.Camera).build()  # 不要忘记 .build()
2cameraOutput = camRgb.requestOutput((300, 300), type=dai.ImgFrame.Type.RGB888p)  # 替换 .preview
3outputQueue = cameraOutput.createOutputQueue()
只需再次调用 requestOutput 即可请求多个输出。对于以前使用 .isp 的全分辨率用例,请改用 requestFullResolutionOutput()对于以前的 MonoCamera 管道,请将 .out 输出替换为 requestOutput,例如
Python
1mono = pipeline.create(dai.node.Camera).build()
2monoOut = mono.requestOutput((1280, 720), type=dai.ImgFrame.Type.GRAY8)

将旧的 ImageManip 移植到新 API

新 API 会跟踪每个转换的顺序,并区分最终图像的如何调整大小。 有关详细信息,请参阅官方文档

v2 示例

Python
1#!/usr/bin/env python3
2
3import cv2
4import depthai as dai
5
6# 创建管道
7pipeline = dai.Pipeline()
8
9camRgb = pipeline.create(dai.node.ColorCamera)
10camRgb.setPreviewSize(1000, 500)
11camRgb.setInterleaved(False)
12maxFrameSize = camRgb.getPreviewHeight() * camRgb.getPreviewWidth() * 3
13
14# 在此示例中,我们使用 2 个 imageManips 将原始 1000x500 的
15# 预览帧分割成 2 个 500x500 的帧
16manip1 = pipeline.create(dai.node.ImageManip)
17manip1.initialConfig.setCropRect(0, 0, 0.5, 1)
18manip1.setMaxOutputFrameSize(maxFrameSize)
19camRgb.preview.link(manip1.inputImage)
20
21manip2 = pipeline.create(dai.node.ImageManip)
22manip2.initialConfig.setCropRect(0.5, 0, 1, 1)
23manip2.setMaxOutputFrameSize(maxFrameSize)
24camRgb.preview.link(manip2.inputImage)
25
26xout1 = pipeline.create(dai.node.XLinkOut)
27xout1.setStreamName('out1')
28manip1.out.link(xout1.input)
29
30xout2 = pipeline.create(dai.node.XLinkOut)
31xout2.setStreamName('out2')
32manip2.out.link(xout2.input)
33
34# 连接到设备并启动管道
35with dai.Device(pipeline) as device:
36    # 输出队列将用于从上面定义的输出获取 rgb 帧
37    q1 = device.getOutputQueue(name="out1", maxSize=4, blocking=False)
38    q2 = device.getOutputQueue(name="out2", maxSize=4, blocking=False)
39
40    while True:
41        if q1.has():
42            cv2.imshow("Tile 1", q1.get().getCvFrame())
43
44        if q2.has():
45            cv2.imshow("Tile 2", q2.get().getCvFrame())
46
47        if cv2.waitKey(1) == ord('q'):
48            break

v3 等效项:

Python
1#!/usr/bin/env python3
2
3import cv2
4import depthai as dai
5
6# 创建管道
7pipeline = dai.Pipeline()
8
9camRgb = pipeline.create(dai.node.Camera).build()
10preview = camRgb.requestOutput((1000, 500), type=dai.ImgFrame.Type.RGB888p)
11
12# 在此示例中,我们使用 2 个 imageManips 将原始 1000x500 的
13# 预览帧分割成 2 个 500x500 的帧
14manip1 = pipeline.create(dai.node.ImageManip)
15manip1.initialConfig.addCrop(0, 0, 500, 500)
16preview.link(manip1.inputImage)
17
18manip2 = pipeline.create(dai.node.ImageManip)
19manip2.initialConfig.addCrop(500, 0, 500, 500)
20preview.link(manip2.inputImage)
21
22q1 = manip1.out.createOutputQueue()
23q2 = manip2.out.createOutputQueue()
24
25pipeline.start()
26with pipeline:
27    while pipeline.isRunning():
28        if q1.has():
29            cv2.imshow("Tile 1", q1.get().getCvFrame())
30
31        if q2.has():
32            cv2.imshow("Tile 2", q2.get().getCvFrame())
33
34        if cv2.waitKey(1) == ord('q'):
35            break