- 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。
以下のサンプルプログラムの肝は
- tiffile packageを利用する
- playback.set_real_timeをFalseにする
です。特に後者が大切です。この記事に限定する話ではないですが、これを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() |
0 件のコメント:
コメントを投稿