Raspberry Pi2/3で3Dセンサーを動かす(2/3)
前回で、Raspberry Pi2でopenframeworksを実行できる環境を作成しました。
3Dセンサー( aeroTAP 3D USBカメラ)を接続して、サンプルプログラムを実行してみます。
準備
詳細スペックは、こちら
サンプルコードのダウンロード
http://www.aerotap.com/developer.html
cd ~
wget http://www.aerotap.com/Help.SDK/sample/videoGrabberExample.zip
unzip videoGrabberExample.zip
3Dセンサーらのデータ取得
Linux環境では、aeroTAP 3D USBカメラは、UVC1.1カメラとして、/dev/video0と/dev/video1 として2つのでデバイスとして表れます。
video0には、カラー画像、video1から深度画像を得ることができます。
追記:
最近、改めて環境を作成するとOS上には、/dev/video0 /dev/video1 /dev/video2 /dev/video3 と見えるようなりました。
この場合には、video0は、カラー画像、video2が深度画像になるため、ソースコードの変更が必要になります。
/aeroTAP/aeroTAPLinuxCamera.cpp を開き
m_hCamera2 = new ofxUvcCamera("/dev/video1", depthWidth, depthHeight);
行を
m_hCamera2 = new ofxUvcCamera("/dev/video2", depthWidth, depthHeight);
*video1 をvideo2に変更
サンプルビルド手順
openframeworksのサンプルコードを利用します。
1.VideoGrabberSampleを使います
cd /home/pi/openframeworks/examples/video/videoGrabberSample
2. ビルドできることを確認
make && make run
*ESCキーで終了
3. ダウンロードしたサンプルを上書き
cd src
mkdir aeroTAP
cp -r -v /home/pi/videoGrabberExample/src/ ./
4. ビルドと実行
make
make run
aeroTAP3D USBカメラからのカラー画像と、深度画像が表示されていることが確認できます。FPSもそこそこ十分出ています。
コード解説
aeroTAPLinux3DCamera( Color Width, Color Height, Depth Map width,Depth Map Height);
*重要: DepthMap widthの値は、Color Widthの半分を指定します。つまり、QVGA (320x240)カラー画像の場合は、160x240を指定します。得られるDepthMapのサイズは、カラー画像と同じ、320x240になります。
aeroCam = new aeroTAPLinux3DCamera(camWidth,camHeight,camWidth/2,camHeight);
Yuv2RGB変換
得られたカラー画像をRGBに変換します。
unsigned char *pTrg= colorImg.getPixels().getData();
YUY2_to_RGB24(pColor, pTrg, camWidth, camHeight);
深度画像
深度画像(Disparity)は、8Bitデータです。実際の距離(mm)に変換するには、ZDTableを利用しますが、ここでは、そのまま表示しています。
ZDTableについては、次回を参照してください。
unsigned char *pDepth = aeroCam->getFrame(typeD);
depthMap.setFromPixels(pDepth,camWidth,camHeight,OF_IMAGE_GRAYSCALE);
次回は、ofVboMeshを使って3D 点群表示してみます。