DepthAI V3 移植指南
DepthAI V3 移植指南
v3 API 中的新增功能
- 不再需要显式创建 XLink 节点 - XLink “桥接”会自动创建。
- 主机节点 - 现在可以在设备端节点上干净地运行主机节点。
- 自定义主机节点 - 用户可以创建在主机上运行的自定义节点
- 支持
ThreadedHostNode和HostNode。 ThreadedHostNode的工作方式类似于ScriptNode;用户指定一个在单独线程 中执行的run函数。HostNode公开一个输入映射inputs,其条目会隐式同步。- 支持 Python 和 C++。
- 支持
- 录制和回放节点。
Pipeline现在有一个可以在创建管道期间查询的实时设备。- 支持新的模型库。
ImageManip的 API 已更新,行为定义更清晰。ColorCamera和MonoCamera已弃用,推荐使用新的Camera节点。
所需的最小更改
- 删除显式创建
dai.Device(除非您有意通过管道构造函数传递实时设备句柄 - 这种情况很少见)。 - 删除显式 XLink 节点。
- 将
dai.Device(pipeline)替换为pipeline.start()。 - 将任何
.getOutputQueue()调用替换为output.createOutputQueue()。 - 将任何
.getInputQueue()调用替换为input.createInputQueue()。
快速移植:简单的 RGB 流示例
# 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 breakColorCamera/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
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 breakv3 等效项:
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