20
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RealSence D435をPythonで使う【画角を合わせる編】(Windows10)

Last updated at Posted at 2019-09-15

#お詫び
半年くらい全く更新がありませんでしたが飽きたわけではなくて
あるイベントのロボット製作が忙しく更新できていませんでした。

VAEとかもほったらかしですし単眼カメラのSLAMとかもやりたいなぁ・・・
・・・
・・・・・・(過労死)

#はじめに

先日PythonでD435を動かすラッパーのビルド方法とかとりあえず表示する方法をアップしたので
この記事からの方は上記もご参照いただきたく・・・

「とりあえず表示編」のスクリプトでIR,RGB,Depthの画像を得ることが出来ましたが
実はRGBとDepthの画角がずれているという問題がありますので、その辺を解決したいと思います

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

#RGB+Depthを表示するスクリプト
まずどのくらいずれているのかを見てみたいと思います

いちいち作るのも面倒かと思いますのでRGBとDepthのカラーマップを並べて表示する
スクリプトを下記に示します

import pyrealsense2 as rs
import numpy as np
import cv2

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

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()

        #RGB
        RGB_frame = frames.get_color_frame()
        RGB_image = np.asanyarray(RGB_frame.get_data())
                
        #depyh
        depth_frame = frames.get_depth_frame()
        depth_image = np.asanyarray(depth_frame.get_data())
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.08), cv2.COLORMAP_JET)


        # 表示
        images = np.hstack((RGB_image, depth_colormap))
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
        if cv2.waitKey(1) & 0xff == 27:#ESCで終了
            cv2.destroyAllWindows()
            break

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

#結果
見ての通りDepthの方が明らかに広角で画角が合っていません
このままのDepthを使用してRGB側にマスクをかけるとずれたり
単眼SLAMの学習データに出来ないという問題が・・・
zure.png

#対策
と書きましたが、私が何かを作ったわけでもなく普通にライブラリにコマンドがありますw
とりあえず動かしてみましょう

import pyrealsense2 as rs
import numpy as np
import cv2

# ストリーム(Depth/Color)の設定
config = rs.config()
#config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30)
#config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30)
#
config.enable_stream(rs.stream.color, 640, 360, rs.format.bgr8, 30)
#
config.enable_stream(rs.stream.depth, 640, 360, rs.format.z16, 30)

# ストリーミング開始
pipeline = rs.pipeline()
profile = pipeline.start(config)

# Alignオブジェクト生成
align_to = rs.stream.color
align = rs.align(align_to)

try:
    while True:

        # フレーム待ち(Color & Depth)
        frames = pipeline.wait_for_frames()
        
        aligned_frames = align.process(frames)
        color_frame = aligned_frames.get_color_frame()
        depth_frame = aligned_frames.get_depth_frame()
        if not depth_frame or not color_frame:
            continue

        #imageをnumpy arrayに
        color_image = np.asanyarray(color_frame.get_data())
        depth_image = np.asanyarray(depth_frame.get_data())


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

        #画像表示
        color_image_s = cv2.resize(color_image, (640, 360))
        depth_colormap_s = cv2.resize(depth_colormap, (640, 360))
        images = np.hstack((color_image_s, depth_colormap_s))
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)

        if cv2.waitKey(1) & 0xff == 27:#ESCで終了
            cv2.destroyAllWindows()
            break

finally:

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

align.png

無事に画角が揃いました!!
~~おわり・・・~~解説したいと思います

#解説
ストリーミングを開始した後に下記の2行を追記し画角を合わせます

# Alignオブジェクト生成
align_to = rs.stream.color
align = rs.align(align_to)

今まではカメラに格納されていたデータを取りに行っていましたが
alignを行ったので処理後のデータを下記のように取得します

 aligned_frames = align.process(frames)
 color_frame = aligned_frames.get_color_frame()
 depth_frame = aligned_frames.get_depth_frame()

正直**「標準でこの状態で出力してくれ」**と思いますが何か不都合があるんでしょうか?

兎にも角にも、これでRGB+Dデータを正しく取得できることが出来ました。
次回は深度情報を使った簡単な事例を・・・紹介できるといいなぁ・・・

20
22
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
20
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?