概要
RealSenseの深度画像でZoomのWeb会議に参加したかった。
手順
- v4l2loopbackで仮想ビデオデバイスを作成
- pyrealsenseでdepth 画像を読んで仮想ビデオデバイスに書き込む
- Zoomの設定画面で仮想ビデオデバイスを選択
環境
OS : ubuntu22.04LTS
RealSense : D435
Python : Python 3.10.12
v4l2loopback のインストールと仮想ビデオデバイスの作成
v4l2loopback のインストール
sudo apt update
sudo apt install v4l2loopback-dkms
仮想ビデオデバイスの作成 (適当にデバイスIDを10とする)
sudo modprobe v4l2loopback video_nr=10
/dev/video10が作成されているか確認
$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
/dev/video10
ソースコード
realsense_to_v4l2.py
import cv2
import pyrealsense2 as rs
import numpy as np
# RealSenseカメラの設定
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# パイプラインの開始
pipeline.start(config)
# GStreamerパイプラインの定義
video_device = "/dev/video10"
gstreamer_pipeline = (
"appsrc ! videoconvert ! videoscale ! video/x-raw,format=I420 ! "
"v4l2sink device=" + video_device
)
# 仮想デバイスへのビデオライターを設定
out = cv2.VideoWriter(gstreamer_pipeline, cv2.CAP_GSTREAMER, 0, 10, (640, 480))
try:
while True:
# フレームの取得
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
if not depth_frame:
continue
# デプスフレームの変換
depth_image = np.asanyarray(depth_frame.get_data())
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
# 仮想デバイスにデータを書き込む
out.write(depth_colormap)
# ウィンドウに画像を表示
cv2.imshow('Depth Image', depth_colormap)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
pipeline.stop()
out.release()
cv2.destroyAllWindows()
※注意 ソースコードはすべてGPT4で書きました。
RealSenseをPCにつないで実行
python3 realsense_to_v4l2.py
Zoom会議を起動してZoomの設定画面のCameraからDummy video device (0x0000)
を選択する。
これでビデオONにすると仮想ビデオデバイスの画像が表示される。
おわりに
RealSenseの深度画像でWeb会議に参加できるようになった。
これでWeb会議でビデオONにしても恥ずかしくないですね。
参考