Raspberry Pi2/3で3Dセンサーを動かす(3/3)

Raspberry Pi2に3Dセンサーを接続することができたので、もう少し3Dぽく表示する方法を紹介します。 

3D 点群の表示には、ofVboMeshを使います。 

 

aerotap.hatenablog.com

 

ZDTableの入手

センサーからのDepthMapの情報 8bitを距離データ(mm)に変換するためのテーブルを予め準備します。

ExportZDTable.exeをaeroTAP3D USBカメラを接続したWindows環境で実行します。

ExportZDTable.exe /VGA

ExportZDTable.exe /QVGA

ExportZDTableは、下記サイトからダウンロードできます。

www.aerotap.com

*WVGA対応版のaeroTAP 3D USBカメラは、直接 shareEDGEまでお問い合わせください。通常版では、対応していません。

 

準備

サンプルコードをダウンロードします。

 

wget

http://www.aerotap.com/Help.SDK/sample/meshFrom3DCamera.zip

 

また、今回は、examples/3d/meshFromCamera を使います。

/home/pi/openframeworks/examples/3d/meshFromCameraを/home/pi/openframeworks/apps/myApps/meshFrom3DCameraとしてコピーします。

 

cp -r -v /home/pi/openframeworks/examples/3d/meshFromCamera /home/pi/openframeworks/apps/myApps/

 

1. ビルドできることを確認

cd /home/pi/openframeworks/apps/myApps/meshFrom3DCamera

make && make run

*3Dセンサーからのカラー画像を使って表示されていることを確認

 

2. サンプルコードで上書き

cp -v-r /home/pi/meshFrom3DCameraExample/* ./ 

 

3. ZDTableを準備

サンプルコードに含まれているものは、他のカメラのデータのため、ご利用のカメラから予めカメラから抽出したZDTableをbin/dataフォルダーに上書きコピーします。

zdTable_VGA.txt

zdTable_QVGA.txt

 

 

4. ビルドと実行

 マウスで、グリグリと3D描画を動かすことができます。24FPS程度出ています。

f:id:aerotap:20180822124319p:plain

3D PointCloud

 

youtu.be

コードの解説

threadedCam()

3Dセンサーからのデータの読み込み、ZDTableの読み込みを行っています。

 

RGBデータを取得

unsigned char *threadedCam::getImage(int cam) 

距離データを取得

 unsigned char *threadedCam::getDepth(int cam){

ここで得られる距離データは、mmに変換された値です。 

 

3D点群への変換

LocalLengthを使って、xx,yyを距離(mm)へと変換します。FocalLengthは、センサーの種類、解像度により異なります。

 

float zz = (float)pDepth[p]; float zz = (float)pDepth[p];

float xx = (float)(x - tCam.camWidth/2)*zz / nFocalLengthW;

float yy = (float)(y - tCam.camHeight/2)*zz / nFocalLengthH;

ofVec3f tmpVec(xx, yy, -zz);

*表示するために、奥行きの符号を変更しています。

点群をVBOに保存

myVbo.setVertex(pp, tmpVec);

myVbo.setVertex(pp, tmpVec);

myVbo.setColor(pp, sampleColor);

 

高速化/表示変更

#define POINT_STEP 2

の値を大きくすると、サンプリングが荒くなり、点群数が減ります。

 

#define POINTSIZE 2 

の値を大きくしると点の描画が大きくなります。

 

考察

今回、単純にカラー画像を、生の深度データをそのままVboMeshに割り当てて表示しています。単純というのは、本気で表示するには、深度データの加工が必要です。

例えば、ノイズの除去(Outlier処理)、アップサンプリング(穴埋め)、平滑化などの処理が必要です。

Raspberry piでこれらをリアルタイムで処理するには、パワー不足かもしれませんが、スケールを荒くしたり、距離フィルターを入れたりすることで点群数を少なくすることである程度実用可能な速度が出ると思いますので、挑戦してみてください。

 

 

Windows版の3Dビューアは、こちら(3D Viewer)にありますので参考にしてください。

 

www.aerotap.com