深度カメラ 点群

深度カメラ(Gemini 336L)の運用①:RGBD画像の撮影と点群化

深度カメラ(ORBBEC Gemini 336L)を用いて,色彩情報と深度情報を撮影してみました。

Gemini 336Lは,最大1280×720解像度で60fpsで撮影可能なステレオ方式の深度カメラです。
Gemini336Lを用いて点群化するのは公式のviewerを用いる方法と,pythonで運用する2パターンがあります。

ORBBEC社が提供する公式のViewerのリンクはこちらです。
Viewerだと簡単にインストールできて点群データを直接出力できますが,撮影するPCによっては負荷がかかりすぎて,ソフトウェアが落ちてしまいます。
そのため,Viewer環境でRGBD画像を撮影して、結果を点群化する方法も有効でした。まずは,RGBD画像の点群化に必要なpythonコードは以下のようになります。
(ChatGPTに助けてもらいました!)

pip install Pillow
pip install numpy
pip install open3d

をpython環境で行った後に,以下のコードを用いるとRGBD画像から点群化が可能です。

import open3d as o3d
import numpy as np
from PIL import Image

# Step 1: RGB画像の読み込みとリサイズ
rgb_fullres = Image.open("000000_color_136494350_1280x720.jpg") #撮影したRGB画像の名前を入力する。
rgb_o3d = o3d.geometry.Image(np.asarray(rgb_fullres))

# Step 2: rawファイルからdepth画像を読み込み(uint16, 848x480)
depth_raw = np.fromfile("000000_depth_136494827_1280x720.raw", dtype=np.uint16).reshape((720, 1280)) #撮影したDepth画像の名前を入力する。
depth_o3d = o3d.geometry.Image(depth_raw)

# Step 3: カメラ内部パラメータ(深度カメラの内部パラメータを入力する。)
fx = 614.129883
fy = 613.886108
cx = 633.588928
cy = 356.022675
intrinsic = o3d.camera.PinholeCameraIntrinsic()
intrinsic.set_intrinsics(width=1280, height=720, fx=fx, fy=fy, cx=cx, cy=cy)

# Step 4: RGBD画像の作成rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
    color=rgb_o3d,
    depth=depth_o3d,
    convert_rgb_to_intensity=False,
    depth_scale=1000.0,  # mm → m
    depth_trunc=3.0
)

# Step 5: 点群生成
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, intrinsic)

# Open3D用に座標軸の向きを修正(右手系)
pcd.transform([[1, 0, 0, 0],
               [0, -1, 0, 0],
               [0, 0, -1, 0],
               [0, 0, 0, 1]])

# 点群の表示
o3d.visualization.draw_geometries([pcd])

# 点群の保存
o3d.io.write_point_cloud("output.ply", pcd)

-深度カメラ, 点群