search
LoginSignup
18
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

RealSence D435をPythonで使う【とりあえず表示編】(Windows10)

はじめに

先日PythonでD435を動かすラッパーのビルド方法をアップしたので
実際にD435を動かすスクリプトをアップします

環境

windows10
python:3.6.6とか3.6.7とか3.6.8
OpenCV:3.4.2
pyrealsense2:2.19.0
numpy:1.15.1

スクリプト全体

下記のプログラムで深度のカラーマップが表示されます

import pyrealsense2 as rs
import numpy as np
import cv2

# ストリーム(IR/Color/Depth)の設定
config = rs.config()

config.enable_stream(rs.stream.infrared, 1, 640, 480, rs.format.y8, 30)
config.enable_stream(rs.stream.infrared, 2, 640, 480, rs.format.y8, 30)
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 = rs.pipeline()
profile = pipeline.start(config)

try:
    while True:
        # フレーム待ち
        frames = pipeline.wait_for_frames()
        #IR1
        ir_frame1 = frames.get_infrared_frame(1)
        ir_image1 = np.asanyarray(ir_frame1.get_data())

        #IR2
        ir_frame2 = frames.get_infrared_frame(2)
        ir_image2 = np.asanyarray(ir_frame2.get_data())

        #RGB
        RGB_frame = frames.get_infrared_frame()
        RGB_image = np.asanyarray(ir_frame2.get_data())

        #Depth
        depth_frame = frames.get_depth_frame()
        depth_image = np.asanyarray(depth_frame.get_data())

        #depth imageをカラーマップに変換
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.08), cv2.COLORMAP_JET)

        # 表示
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', depth_colormap)

        if cv2.waitKey(1) & 0xff == 27:
            cv2.destroyAllWindows()
            break

finally:
    # ストリーミング停止
    pipeline.stop()

解説

中身をざっくり説明します

ストリーム(IR/Color/Depth)の設定

ここで、IR,RGB,Depthの入力のサイズとかフレームレートとか設定します
IRはステレオで2台積んでいるので下記のように記入するとカメラを指定できます
使わないカメラがある場合、設定しなくても大丈夫です。

DepthはハードウェアがあるわけではないですがIRカメラ+プロジェクタを使って
カメラ内で距離データが演算されデータが格納されます

設定値についてはマニュアルかrealsense-viewerあたりを動かして
設定できる値を記入してください

RGBとIR(Depth)で設定値が結構違うのでイラっとします(笑


config = rs.config()

config.enable_stream(rs.stream.infrared, 1, 640, 480, rs.format.y8, 30)
config.enable_stream(rs.stream.infrared, 2, 640, 480, rs.format.y8, 30)
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 = rs.pipeline()
profile = pipeline.start(config)

※ここから先がループ部分です

フレーム待ちは絶対必要ですが、各カメラの出力の配列は必要なのだけ書けばOKです


# フレーム待ち
frames = pipeline.wait_for_frames()

#IR1
ir_frame1 = frames.get_infrared_frame(1)
ir_image1 = np.asanyarray(ir_frame1.get_data())

#IR2
ir_frame2 = frames.get_infrared_frame(2)
ir_image2 = np.asanyarray(ir_frame2.get_data())

#RGB
RGB_frame = frames.get_infrared_frame()
RGB_image = np.asanyarray(ir_frame2.get_data())

#Depth
depth_frame = frames.get_depth_frame()
depth_image = np.asanyarray(depth_frame.get_data())

depth imageをカラーマップに変換

上記のままですとDepthの配列がuint16なので疑似RGB変換をしてコンターっぽくします
この変換だといまいちなのですが、とりあえず表示させるだけなら問題ないので掲載します
※対策版は今後UPするかも・・・


depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.08), cv2.COLORMAP_JET)

表示

何位変哲もないOpenCVなので割愛


cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
cv2.imshow('RealSense', depth_colormap)

if cv2.waitKey(1) & 0xff == 27:
    cv2.destroyAllWindows()
    break

上記ですとRGBとDepthの画角が合わないのですが
それはまた次回以降に・・・

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
What you can do with signing up
18
Help us understand the problem. What are the problem?