cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

Kinectの点群データ圧縮のためにc++で使える圧縮解凍ライブラリgoogle snappyをMSVCでビルドする

3次元点群データは、データサイズが大きくなります。現在のPCであればローカルで扱う分には特に問題ないのですが、ネットワークはギガビットイーサ以降進歩が滞っているので遠隔地に送りたい場合には大きすぎます。また、多少ネットワークが速くなったとしても、いつの時代もIOに比べてCPUの方が圧倒的に速いので、CPUの力を借りてデータサイズを圧縮してから転送することにします。

 

C++で簡単に使える圧縮解凍ライブラリを探すと、google snappy*1というのがc++で簡単に使えて高速で良さそうだということが分かりました。ライセンスはBSD Licenseです。

http://news.mynavi.jp/column/tool/052/

まず、snappyのソースコードをダウンロードします。ダウンロードから最新版をダウンロードして解凍します。2013/11/07現在snappy-1.1.1.tar.gzが最新。tar.gzの解凍は、LhaForge等で。

https://code.google.com/p/snappy/

 

次に、msvcでsnappyをコンパイルして静的ライブラリを作る準備をします。MSVCでビルドするためのプロジェクトを公開されている方がいるので、Download ZIPボタンを押してダウンロードしてきます。解凍後、フォルダ名の-masterを消して、snappyを解凍して出来たディレクトリの中に移動してください。

https://github.com/kmanley/snappy-msvc

/snappy-1.1.1/snappy-msvc

となるようにします。

 

そのままだとssize_tなどの定義が無いと怒られるので、unistd.hを無理やりWindowsで使えるようにします。下記のページを参考に、unistd.hというファイルを作ってコピーペーストします。

http://d.hatena.ne.jp/deraw/20070517/1179334643

また、minという関数名と数値比較用の定義がぶつかって上手くコンパイルできないので、snappy.ccというファイルの先頭に次の2行を足して、minの定義を外しておきます。

#include "unistd.h"

#undef min

ビルドするとsnappy-msvc/Release, snappy-msvc/Debugの下にそれぞれsnappy.libが出来ています。

使い方は、このサイトに綺麗にまとめられています。

http://s-yata.jp/docs/snappy/

 

(補足)

Snappyで3次元点群の圧縮すると、ゼロの領域を削ってくれるぐらいで本質的には小さくなりません。おそらく3次元点群圧縮の正解は、short型を上下8ビットづつ2つの画像に分けて100%jpg圧縮ですね。画像のもつ性質を生かさないと、効率的な圧縮はできないようです。

*1:LZOの方が圧縮速度が速いそうなので、今回の場合lzoの方が良いかもしれません。