3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像処理・画像解析Advent Calendar 2024

Day 6

RealSenseを使用したソフトウェアトリガーによる画像キャプチャ

Posted at

Intel RealSenseカメラは、RGBおよび深度画像をリアルタイムで取得する事ができるデプスカメラです。ソフトウェアトリガーを使用することで、特定のタイミングで画像キャプチャを制御することができます。本記事では、Intel RealSense SDKを活用してソフトウェアトリガーを実装する方法を解説します。

必要なもの

・Intel RealSenseカメラ(D415, D435, L515 など)
・Intel RealSense SDK 2.0

SDKは公式サイト、または以下のコマンドでインストールできます。

pip install pyrealsense2

ソフトウェアトリガーの概要

RealSenseのソフトウェアトリガーは、特定のイベント(例: 外部信号やタイマー)に応じて画像キャプチャを開始する制御機能です。これにより、リアルタイムで連続的にストリームを取得するのではなく、必要なタイミングでのみデータを取得することが可能になります。
以下のコードでは、RealSenseカメラを使用して、ソフトウェアトリガーにより特定のタイミングでRGB画像と深度画像をキャプチャします。

import pyrealsense2 as rs
import numpy as np
import cv2
import time

# RealSenseパイプラインのセットアップ
pipeline = rs.pipeline()
config = rs.config()

# RGBと深度ストリームを有効化
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

# パイプラインの開始
pipeline.start(config)

try:
    while True:
        # トリガー条件をチェック(ここでは時間間隔で制御)
        print("Capturing frame in 3 seconds...")
        time.sleep(3)  # 3秒待機(ソフトウェアトリガーの代替条件)

        # フレーム取得
        frames = pipeline.wait_for_frames()

        # RGB画像と深度画像を取得
        color_frame = frames.get_color_frame()
        depth_frame = frames.get_depth_frame()

        if not color_frame or not depth_frame:
            continue

        # フレームをNumPy配列に変換
        color_image = np.asanyarray(color_frame.get_data())
        depth_image = np.asanyarray(depth_frame.get_data())

        # 深度画像をカラーで表示
        depth_colormap = cv2.applyColorMap(
            cv2.convertScaleAbs(depth_image, alpha=0.03),
            cv2.COLORMAP_JET
        )

        # RGB画像と深度画像を横並びで表示
        combined_image = np.hstack((color_image, depth_colormap))
        cv2.imshow('RealSense Software Trigger Capture', combined_image)

        # キャプチャ画像を保存
        timestamp = int(time.time())
        cv2.imwrite(f'color_{timestamp}.png', color_image)
        cv2.imwrite(f'depth_{timestamp}.png', depth_colormap)

        print(f"Captured and saved frames at {timestamp}")

        # 'q'キーで終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

finally:
    # パイプラインを停止
    pipeline.stop()
    cv2.destroyAllWindows()

パイプラインの設定
RealSense SDKでは、rs.pipeline()を使用してデータストリームを管理します。
config.enable_stream()で使用するストリーム(RGB, 深度)を有効化します。

ソフトウェアトリガー
この例では、time.sleep()で3秒ごとにフレームをキャプチャするよう設定しています。外部イベントに応じたキャプチャを実現するには、GPIOやネットワークイベントをトリガー条件として追加できます。

フレーム取得と保存
pipeline.wait_for_frames()で現在のフレームを取得。
RGBと深度の両方の画像をNumPy配列として取得し、処理や保存に利用。

画像の可視化
深度画像はそのままでは見えづらいため、cv2.applyColorMapを用いて可視化しています。

応用例

外部センサーとの連携: GPIOや通信プロトコルでトリガーを送信し、カメラを制御。
リアルタイム解析: キャプチャしたデータをAIモデルに入力し、物体検出や姿勢推定を実行。
工業用途: 生産ラインで特定のタイミングで計測や検査を行う。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?