Intel RealSense D400シリーズを赤外線カメラとして使う

intel RealSense™ Depth Camera D435

intel RealSense™ Depth Camera D435

Kinect後継として指名されているIntelのRealSenseシリーズだが、距離をセンシングするIRステレオカメラ部は、単体の赤外線カメラとして利用可能だ。性能、値段、入手性のバランスが優れた赤外線カメラと言える。D415とD435の2種類あり、後者のほうが広角なのだが、センサからして違うので、どちらを選ぶかの参考になるように記事をまとめた。

赤外線カメラとしてのD400シリーズの仕様

  • D415とD435ではIRステレオカメラ部分が違う
    • D415はIRカットフィルムのない通常の可視光にピークを合わせたカメラ
    • D435は赤外線領域にピークを合わせているカメラ
  • 可視光カットフィルムを使うことでほぼ問題なく可視光カット可能
  • 画角が異なるため赤外線プロジェクターも異なる
  • Intel公式ではなくMouserにあったデータシートが良かった

f:id:miso_engine:20181126173607p:plain

librealsenseのPythonラッパーで赤外線カメラを使うコード

librealsenseはIntel公式のようで公式ではないらしいSDK。特に問題なく使えるが、コメントで書いた通り、カメラ側に設定を反映させるのに変なコツがいる。

# coding: utf-8

import pyrealsense2 as rs
import numpy as np
import cv2

# Stop Laser Emitter
context = rs.context()
sensor = context.sensors[0]
sensor.set_option(rs.option.emitter_enabled, 0.0)

# pipelineを一度start()しないと最初の接続時に設定が反映されない
pipeline = rs.pipeline()
pipeline.start()
pipeline.stop()

config = rs.config()
config.enable_stream(rs.stream.infrared, 1, 1280, 720, rs.format.y8, 30)

pipeline.start(config)
cv2.namedWindow('pysense', cv2.WINDOW_AUTOSIZE)

try:
    while True:

        frames = pipeline.wait_for_frames()
        ir_frame = frames.get_infrared_frame()
        if not ir_frame:
            continue

        ir_image = np.asanyarray(ir_frame.get_data())
        
        cv2.imshow('pysense', ir_image)
        k = cv2.waitKey(1)
        if k == 27:
            break
            
finally:
    pipeline.stop()
    cv2.destroyAllWindows()

f:id:miso_engine:20181126175749p:plain
D415の赤外線カメラ画像

バイイングガイド

赤外線カメラとして利用する場合、D435の方が、

  1. センサが赤外線にピークを合わせている
  2. D415よりも広角
  3. 1280x800で30fps出せる(D415は1280x720)

といった値段相応の機能性と使いやすさがあるため、ケチケチしたプロジェクトでない限りはD435がオススメだ。