記事検索

検索ワードを入力してください。
Sky Tech Blog
RealSense D455と​pyrealsense2で​3次元点群データを​取得する​方​法

RealSense D455と​pyrealsense2で​3次元点群データを​取得する​方​法

Intel社のRealSense D455カメラとPythonライブラリのpyrealsense2を使用し、3次元点群データを取得する方法について解説します。

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次元点群データを取得する方法を紹介しました。興味のある方はぜひお試ししてみてください。

最後までお読みいただき、ありがとうございました。


XFacebookLINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム