Open3
カスタムしてdepthai uvcカメラを作るにはどうすれば良いのか?
公式のサンプルコードの抜粋にコメントをつけてみる。
#↓これはdepthaiとは別のもの。pythonでバーチャルカメラを実現するモジュールか。
import pyvirtualcam
#↓depthaiのモジュール
import depthai as dai
# Create pipeline
#↓ここでいうパイプラインは何処の部分の処理だろう?デバイス内の処理?それともデバイスからホストまでの通信経路?
pipeline = dai.Pipeline()
#↓パイプラインにカメラのインスタンスを作らせる。ここでてくるnodeはなに?
cam = pipeline.create(dai.node.ColorCamera)
cam.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB)
cam.setPreviewSize(1280,720)
#↓XLinkはIntel Movidius VPU とホスト間の通信経路のことだったか?
xout = pipeline.create(dai.node.XLinkOut)
xout.setStreamName("rgb")
cam.preview.link(xout.input)
# Connect to device and start pipeline
with dai.Device(pipeline) as device, pyvirtualcam.Camera(width=1280, height=720, fps=20) as uvc:
qRgb = device.getOutputQueue(name="rgb", maxSize=4, blocking=False)
print("UVC running")
while True:
frame = qRgb.get().getFrame()
uvc.send(frame)
カスタムしたカメラを作るにはdai.node
下にカスタムしたカメラクラスを作る必要があるといことか?
XLinkはデバイス・ホスト間のインターフェースAPIのこと。ここにある図からPipelineとはデバイス内のプロセスを管理するAPIということも分かる。
デバイスにおける機能の単位がNode
。Node
にはColorCamera
、MonoCamera
などのカメラ、EdgeDetector
、ObjectTracker
、StereoDepth
、Script
などの処理・検出機能、XLinkIn
、XLinkOut
などの通信機能がある。カスタムカメラのNode
を作るよりはカメラノードと処理系の
Nodeを作った用が良いかもしれない。
Script`ノードはパイプライン内のノードをホストのpythonスクリプトから制御するためのもので重たい計算処理には用いることができない。
ImageManip
は画像の加工を行うノード。恐らく本牧的にはこのノードを用いた方がよいのだろう。
加工した後、XLinkOut
につなぐ前に動画としてエンコードする必要がるだろう。
DepthAIではモノクロペアのカメラでデプスを測り,カラー画像の撮影には別のカメラを用いている。
デバイス上の処理を作るには3つの方法がある。
- Script Nodeを作る
- カスタムNeuralNetworkノードを作る
- カスタムOpenCLカーネルを作る
- Scripting - Using Python3.9 with Script node
- Creating your own NN model to run more computationally heavy features
- Creating custom OpenCL kernels
画像処理を行うのなら2番のカスタムNeuralNetworkノードを作るのが適しているか。
3つのカメラ画像を連結するだけのサンプルがある。
NN modelを使うとそれの処理で律速する可能性がある。