RealsenseのDepthデータを保存するには、
Realsense Viewerで保存する
自前のプログラムで保存する
の2つの方法があります。前者については、Realsense Viewerの保存機能を利用することでROS-Bag形式で保存されるのですが、ファイルサイズがでかい。。。しかし、いつのまにかRealsense Viewerの保存オプションに圧縮というのがあって、それを使うと50%くらい圧縮してくれます。まあ、通常はこれをおすすめします。しかし、それでもでかいのでもっとファイルサイズを小さくできないか、、という後者の話が今日のネタです。
前提条件
今回の記事は、
Realsense ViewerでROS-Bagファイルとして保存しておく
そのROS-BagファイルをMulti-Tiffに変換する
という使い方を前提とします。本来であれば、リアルタイムにMulti-Tiffに変換できたらいいんですが、Pythonだとちょっと厳しい。。。フレームレートが半分以下になります。C#でマルチスレッドで処理すればいけそうですけど、暇な時にトライします(最近Pythonにどっぷりハマっているので、いつになるかは不明)
16bit Grayscale Multi-Tiffで保存する
いろいろ方法はあるのだと思いますが、今回は16bit Grayscale Multi-Tiffで保存する方法です。まあこれが一番ラクでしょう。Depthデータをそのまま放り込めばよくてしかも取り出しそのままでOK。
以下のサンプルプログラムの肝は
です。特に後者が大切です。この記事に限定する話ではないですが、これをFalseにしておかないと、非同期で処理が行われてしまい、フレームレートが落ちます。
画像の表示に注意
16bit Grayscale Multi-Tiffの画像は、
Windows10のフォトアプリ
ImageJ(オープンソースの画像処理系では有名なソフト)
などを利用することで表示できますが、個人的には後者がおすすめです。マウス操作で各ピクセルの画素値を表示してくれますので。なお、画像はほぼ真っ黒に見えると思います。その理由は、16bitだと0mm~65536mmの距離を記録できるわけですが、デプスデータは、せいぜい6000mmがMax。16bitの濃淡は表示される段階で8bitに変換されますので、ほぼ黒側(0側)に近いことになりますからね。目を凝らしてみると、黒の濃淡がわかるはずです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*-
# use tiffile library
# https://pypi.org/project/tifffile/
import pyrealsense2 as rs
import numpy as np
import tifffile
#1280*720
resX=1280
resY=720
# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_device_from_file('depth10sec.bag')
config.enable_stream(rs.stream.depth, resX, resY, rs.format.z16, 30)
# Init
profile = pipeline.start(config)
playback = profile.get_device().as_playback()
playback.set_real_time(False) # <--- very important setting to get all frames
depth_sensor = profile.get_device().first_depth_sensor()
depth_scale = depth_sensor.get_depth_scale()
count=0
oldTimeStamp=0
try:
# for first frame
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
currentTimestamp = depth_frame.timestamp
i=0
while (True):
depth_frame = frames.get_depth_frame()
if not depth_frame:
continue
# Get Depth data
depth_image = np.asanyarray(depth_frame.get_data())
#Save multi-Tiff
tifffile.imsave('depth16.tif', depth_image, compress=6, append=True)
print(i)
i +=1
# フレーム待ち(Depth & Color)
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
oldTimeStamp=currentTimestamp
currentTimestamp = depth_frame.timestamp
if oldTimeStamp>=currentTimestamp:
break
finally:
pipeline.stop()