Open3Dの使い方:自分で点群を生成

More than 1 year has passed since last update.

pythonで点群処理できるOpen3Dの探検.Open3Dの使い方:読み込みと表示,点と法線の取得の続き.

点群のコンストラクタはpy3d.PointCloud().コピーコンストラクタしかないようなので,空で生成しておいて後から.points追加.するとhas_points()も自動的に更新される.


コード


open3d

import sys

sys.path.append("../..") # Open3D/build/lib/ へのパス
import numpy as np
import py3d

# 球状の点群を生成
## 面倒なので立方体中にランダムな点を作ってL2ノルムで正規化.よい子は真似しない
sphere = np.random.rand(10000, 3) - np.array([0.5, 0.5, 0.5])
sphere /= np.linalg.norm(sphere, axis=1, keepdims=True)

pcd = py3d.PointCloud() # コンストラクタ
print("has points?", pcd.has_points()) # ここではFalse
pcd.points = py3d.Vector3dVector(sphere)
print("has points?", pcd.has_points()) # ここでTrueになってる
py3d.draw_geometries([pcd], "sphere points", 640, 480)

print("has color?", pcd.has_colors()) # ここではFalse
pcd.colors = py3d.Vector3dVector(np.random.rand(10000, 3))
print("has color?", pcd.has_colors()) # ここでTrueになってる
py3d.draw_geometries([pcd], "sphere points with random colors", 640, 480)

print("has normals?", pcd.has_normals()) # ここではFalse
py3d.estimate_normals(pcd, search_param = py3d.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
print("has normals?", pcd.has_normals()) # ここでTrueになってる
py3d.draw_geometries([pcd], "sphere points with normals", 640, 480)



結果


結果

has points? False

has points? True
has color? False
has color? True
has normals? False
has normals? True

点を生成

スクリーンショット 2018-03-21 21.43.36.png

ランダムに色をつけた

スクリーンショット 2018-03-21 21.43.44.png

法線を計算するとシェーディングされる

スクリーンショット 2018-03-21 21.43.52.png