pyrealsense2を使用してRealSense D455で撮影した画像から3次元点群データ(PLY)を取得する方法について紹介します。
RealSense D455
Intel社が発売しているDepthカメラです。深度センサやRGBセンサなどが搭載されています。こちらのカメラの詳細はIntel社のサイトでご覧ください。
開発環境・ライブラリ
今回、3次元点群データを取得する際の開発環境と使用ライブラリは以下の通りです。
開発環境
-
ハードウェア
- RealSense D455
- Windows PC
-
ソフトウェア
- Python(v 3.11.9)
- VS Code
-
Pythonライブラリ
- argparse
- numpy
- open3d
- pyrealsense2
※ pyrealsense2とopen3dは対応しているPythonのバージョンが限られているため、ご注意ください。
3次元点群データの取得手順
①3次元点群データの取得(PLYファイルの保存)→②表示(確認)の順で実装します。
①3次元点群データの取得(PLYファイルの保存)
- RGBカメラとDepthカメラのカメラ設定を行い、撮影を開始します。撮影する画像のサイズなどが設定できます。
# カメラの設定
conf = rs.config()
# RGB
conf.enable_stream(rs.stream.color, 640, 480, rs.format.rgb8, 30)
# Depth
conf.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# stream開始
pipe = rs.pipeline()
profile = pipe.start(conf)
- フレームデータを取得します。
# frameデータを取得
color_frame = frames.get_color_frame()
depth_frame = frames.get_depth_frame()
- 取得したデータを画像データに変換します。
# 画像データに変換
color_image = np.asanyarray(color_frame.get_data())
rgb_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)
# Depthカメラの情報をカラースケール画像に変換する
depth_color_frame = rs.colorizer().colorize(depth_frame)
depth_image = np.asanyarray(depth_color_frame.get_data())
# 画像保存処理
cv2.imwrite('color_image.png', rgb_image)
cv2.imwrite('depth_image.png', depth_image)
- 取得したRGB画像とDepth画像を使用して、3次元点群データを生成します。
# 3次元点群データを生成
pc = rs.pointcloud()
pc.map_to(color_frame)
points = pc.calculate(depth_frame)
- 生成した3次元点群データをplyファイルとして保存します。
# 3次元点群データをPLYファイルとして保存
points.export_to_ply('pointcloud.ply', color_frame)
②表示(確認)
以下のソースコードにて表示を行います。
# 3次元点群データのPLYファイルを読み込み
point_cloud = o3d.io.read_point_cloud('pointcloud.ply')
# 3次元点群データにRGB画像を適用
o3d.visualization.draw_geometries([point_cloud])
取得した結果が下の画像です。
撮影したデータをそのまま点群として取得しているので、外れ値除去などできれいにするとより精度の良い3次元点群データが取得できると思います。
撮影したRGB画像とDepth画像はそれぞれ下のようになっています。
- RGB画像
- Depth画像
今回、3次元点群データの取得に使用した全体のソースコードは以下の通りです。
import pyrealsense2 as rs
import numpy as np
import open3d as o3d
import cv2
# カメラの設定
conf = rs.config()
# RGB
conf.enable_stream(rs.stream.color, 640, 480, rs.format.rgb8, 30)
# 距離
conf.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# stream開始
pipe = rs.pipeline()
profile = pipe.start(conf)
try:
frames = pipe.wait_for_frames()
# frameデータを取得
color_frame = frames.get_color_frame()
depth_frame = frames.get_depth_frame()
# 画像データに変換
color_image = np.asanyarray(color_frame.get_data())
rgb_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)
# 距離情報をカラースケール画像に変換する
depth_color_frame = rs.colorizer().colorize(depth_frame)
depth_image = np.asanyarray(depth_color_frame.get_data())
# カラー画像保存
cv2.imwrite('color_image.png', rgb_image)
# デプス画像保存
cv2.imwrite('depth_image.png', depth_image)
# 3次元点群データを生成
pc = rs.pointcloud()
# points = pc.calculate(depth_frame)
pc.map_to(color_frame)
points = pc.calculate(depth_frame)
# 3次元点群データをPLYファイルとして保存
points.export_to_ply('pointcloud.ply', color_frame)
# 3次元点群データのPLYファイルを読み込み
point_cloud = o3d.io.read_point_cloud('pointcloud.ply')
# 3次元点群データを表示する
o3d.visualization.draw_geometries([point_cloud])
finally:
pipe.stop()
cv2.destroyAllWindows()
最後に
今回はRealSense D455とpyrealsense2を使用して3次元点群データを取得する方法を紹介しました。興味のある方はぜひお試ししてみてください。
最後までお読みいただき、ありがとうございました。