Python pptk でお手軽点群表示

pptk - Point Processing Toolkit という Python ライブラリを知り、Qiita記事やその他の日本語情報がなさそうだったので紹介記事を書きます。


pptk について

pptk は位置情報を扱うオランダの企業 HERE Technologies で開発されているようです。本記事の執筆時点ではバージョンは0.1.1で、MITライセンスになっています。

Python には同時期に登場した Open3D という点群処理ライブラリがあり、そちらの方が機能が豊富です。というか、pptk の機能は現時点でかなり限定的で、点群処理ライブラリと言いながら、ドキュメントのページ処理の項 には法線推定と k-d tree での最近傍探索しか載っていません。GitHub の最終コミットも2018年10月5日となっており(2019年1月24日現在)、あまり活発ではなさそうです。

ただ、機能が限定されている分、ビューワーに関しては点群処理ライブラリを初めて使った私でも簡単に使えて便利でしたので、簡単な例をご紹介します。複雑な例についてはチュートリアルのページをご覧ください。


インストール方法

pip install pptk

で入ります。私の場合は pptk==0.1.0 が入りました。


Ubuntu 18.04 での注意

Ubuntu 18.04 の場合は以下のイシューに書かれている対応が必要となります。

virtualenv (Python 3.6) を例にすると以下のような手順を行います。

cd venv/lib/python3.6/site-packages/pptk/libs/

mv libz.so.1 libz.so.1.old
ln -s /lib/x86_64-linux-gnu/libz.so.1


点群を表示

ビューワーのドキュメントページ に必要なことは大体書いてあります。

ランダムに100個の点を生成し、表示するコードは以下のようになります。

xyz = pptk.rand(100, 3)

v = pptk.viewer(xyz)
v.set(point_size=0.005)

sc1.png

更に点にランダムな色をつけたい場合は、

rgb = pptk.rand(100, 3)

v = pptk.viewer(xyz, rgb)
v.set(point_size=0.005)

sc2.png

色はRGBそれぞれを0から1までの数値で表します。ここで xyzrgb は pptk の Points というクラスですが、Python のリストや、NumPy の array を入れてもOKです。

さらに色の指定は可変長引数になっていて複数指定できます。

rgb1 = pptk.rand(100, 3)

rgb2 = pptk.rand(100, 3)
v = pptk.viewer(xyz, rgb1, rgb2)
v.set(point_size=0.005)

色の切り替えはキーボード操作で [] で出来ます。

animated.gif

ビューワーは他にもマウスやキーボード操作ができます。ホットキーは 1, 3, 5, 7, c などがあります。詳しくはビューワーのドキュメントページを参照してください。

その他、スクショを撮ったり録画したり、アニメーション表示したりもできるようです。


画像の表示

座標と色を指定できるようになったので画像を表示してみたいと思います。

import numpy as np

from PIL import Image
import pptk

imgs = [Image.open(fname) for fname in ['wanihakase.jpg', 'sugamon.jpg','okazaki.jpg']]
rows, cols = imgs[0].size

pts = [[r/1.414, c, -r/1.414] for r in range(rows) for c in range(cols)]
v = pptk.viewer(pts)

colors = [np.array(img.getdata())/255 for img in imgs]
v.attributes(*colors)

animated.gif

この例のように色の指定は pptk.viewer() だけではなく pptk.viewer.attributes() でもできます。

今回使用したコードは画像も一緒にこちらのリポジトリに置いてあります。


Reference