概要
研究で使おうとしていた点群データがテキストファイルで提供されており、可視化をしたいと思ったものの3Dファイルの作り方がよくわからなかったので、ChatGPT様にお願いしました。
今回使用するデータセット:https://github.com/czq142857/BAE-NET にて提供されているデータセット
(元データはA Scalable Active Framework for Region Annotation in 3D Shape Collections )
ChatGPTの回答
質問内容
以下のような、一番右の値がクラスIDを示す、テキストファイルに書かれた点群データを、同じクラスIDを持つ点に同じ色を付与して、obj形式に変換したい。pythonで実装する方法を教えて。
-0.182850 0.206710 -0.143640 0.156600 -0.987600 0.007967 12.000000
-0.219480 0.243130 0.110640 -0.963900 -0.030290 0.264400 12.000000
-0.233670 0.382100 -0.009580 -0.953300 0.298200 -0.048420 12.000000
-0.205430 0.209390 -0.143920 -0.372100 -0.928000 -0.018820 12.000000
0.112450 0.048600 -0.033050 0.003796 1.000000 0.000014 13.000000
0.110120 0.048700 0.084670 0.048400 0.998800 0.000005 13.000000
0.111600 0.048630 0.042720 0.043930 0.999000 0.000002 13.000000
0.101950 0.049040 -0.020610 0.042370 0.999100 0.000032 13.000000
回答
Pythonで実装するには、まずファイルから点群データを読み込み、それらをパースして、必要な情報を抽出します。その後、それらの点に対して色を割り当て、obj形式に変換して保存することができます。
詳細な手順は以下になります。
-
ファイルから点群データを読み込み、それらをパースします。
points = [] with open("points.txt", "r") as f: for line in f: x, y, z, a, b, c, class_id = [float(i) for i in line.split()] points.append([x, y, z, class_id])
-
各クラスIDに対して色を割り当てます。
colors = {} for point in points: class_id = point[-1] if class_id not in colors: # 適当な色を割り当てる colors[class_id] = [random.random(), random.random(), random.random()]
-
obj形式のテキストを生成し、ファイルに保存します。
with open("points.obj", "w") as f: for point in points: class_id = point[-1] color = colors[class_id] f.write("v {} {} {} {} {} {}\n".format(point[0], point[1], point[2], color[0], color[1], color[2]))
まとめ
文章として分かりづらい日本語でも、きちんと返してくれるのが素直にすごいと思いました。しかもちゃんと動く。
色部分だけはクラスIDごとに特定の色になるように別途color_listを用意して設定して、さっそく点群データ(.obj)を生成してみました。
生成結果
MeshLabのスクショなので見づらいですが、きちんと色分けされています。
点群のみであればv
行だけでよいのも今回初めて知りました。
ChatGPTを今後も活用しながら勉強してみようと思います。