Closed3
JetsonのCSIカメラを2台同期撮影したい。
1台のカメラでのキャプチャ(Python, OpenCV+Gstreamer)
import cv2
def open_gstreamer(sensor_id=0, width=1920, height=1080, fps=30):
GST_STR = f'nvarguscamerasrc sensor-id={sensor_id}\
! video/x-raw(memory:NVMM), width={width}, height={height}, format=(string)NV12, framerate=(fraction){fps}/1 \
! nvvidconv ! video/x-raw, width=(int){width}, height=(int){height}, format=(string)BGRx \
! videoconvert \
! appsink'
return cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)
上記スクリプトを使って、1920x1080@30fpsで2つのカメラを別々に起動したら、大体同じくらいのタイミングでは撮影できているが、0.5sくらいの遅延が発生。
2台のカメラを同時にキャプチャして、横並びの1つの画像として取得。
videomixerを使うとStreamを並べることができる。
ストップウォッチアプリを撮影してみて、同時にキャプチャできていることを確認。(厳密には同期ではないかも)
import cv2
def open_gstreamer(sensor_ids=[0, 1], width=640, height=480, fps=30):
sensor0 = sensor_ids[0]
sensor1 = sensor_ids[1]
GST_STR = "videomixer background=1 name=mix " + \
"sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=1 sink_0::zorder=0 " + \
f"sink_1::xpos={width} sink_1::ypos=0 sink_1::alpha=1 sink_1::zorder=1 " + \
f"! videoconvert ! appsink sync=false " + \
f'nvarguscamerasrc sensor-id={sensor0} ' + \
f'! video/x-raw(memory:NVMM), width={width}, height={height}, format=(string)NV12, framerate=(fraction){fps}/1 ' + \
f'! nvvidconv ! video/x-raw, width=(int){width}, height=(int){height}, format=(string)BGRx' + \
f'! queue ' + \
f'! mix.sink_0 ' + \
f'nvarguscamerasrc sensor-id={sensor1} ' + \
f'! video/x-raw(memory:NVMM), width={width}, height={height}, format=(string)NV12, framerate=(fraction){fps}/1 ' + \
f'! nvvidconv ! video/x-raw, width=(int){width}, height=(int){height}, format=(string)BGRx' + \
f'! queue ' + \
f"! mix.sink_1"
return cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)
このスクラップは2022/04/03にクローズされました