MacでKinect v2を使うlibfreenect2 (OpenGL編)

2ヶ月以上前に書いた日記ではOpenGLを使った場合、IRとDepthが正しく表示されなかった。

MacBook Pro Retina で Kinect for Windows v2 を認識させる - hcrescの日記

PRでOpenGLを使って画像を表示できるようになったようなので、試してみる

fixed OpenGLDepthPacketProcessor texture upload by gaborpapp · Pull Request #171 · OpenKinect/libfreenect2 · GitHub

手順

2ヶ月で色々と変更されているので、手順をやり直す。

git clone git@github.com:OpenKinect/libfreenect2.git

cd ./libfreenect2

sh ./depends/install_mac.sh

sh ./depends/install_mac.shでエラーが出た場合は内容に応じて修正してインストールやり直す。

うちの場合は下記を修正した。

+#./configure --disable-dependency-tracking --host x86_64-apple-darwin --with-jpeg8 --prefix=$LIBJPEG_INSTALL_DIR 
+./configure --disable-dependency-tracking --host x86_64-apple-darwin NASM=/usr/local/Cellar/nasm/`brew info --json=v1 nasm | jq -r '.[0]["installed"][0]["version"]'`/bin/nasm --with-jpeg8 --prefix=$LIBJPEG_INSTALL_DIR 

PRにあるとおり修正する

cd ./examples/protonect/

vi src/opengl_depth_packet_processor.cpp

makeして実行

cmake CMakeLists.txt
make && make install

./bin/Protonect

結果

$ bin/Protonect 
[Freenect2Impl] enumerating devices...

<snip>


[OpenGLDepthPacketProcessor] avg. time: 14.0433ms -> ~71.2083Hz
[TurboJpegRgbPacketProcessor] avg. time: 18.4621ms -> ~54.1649Hz
[OpenGLDepthPacketProcessor] avg. time: 12.8123ms -> ~78.0501Hz
[TurboJpegRgbPacketProcessor] avg. time: 18.2471ms -> ~54.8032Hz
[OpenGLDepthPacketProcessor] avg. time: 12.9174ms -> ~77.4152Hz
[TurboJpegRgbPacketProcessor] avg. time: 18.06ms -> ~55.371Hz
[OpenGLDepthPacketProcessor] avg. time: 13.578ms -> ~73.6486Hz

RGB,IR,Depthすべて表示OK!

f:id:hcresc:20150221183830p:plain

CPU負荷はOpenCLと同じくらい。。

OpenCVの描画が重いのかな

それと、EscキーでProtonectを終了するときにSegFaultがでるようになった。。

f:id:hcresc:20150221184023p:plain

メンドクサイネ

OpenGLのTutorialまとめ

#OpenGL(ES)のTutorial集

All about OpenGL ES 2.x - (part 1/3)

  • OpenGL ES 2.x系のTutorial。Part1はOpenGL自体の概念的な説明になっている。

Displaying Graphics with OpenGL ES | Android Developers

OpenGL ES 2.0 Tutorial for Android - Part I - Getting started - Jayway

Android Lesson One: Getting Started | Learn OpenGL ES

About OpenGL ES

  • iOS Developer Library

OpenGL Tutorial for iOS: OpenGL ES 2.0 - Ray Wenderlich

TutorialはES2.0系を扱ったものが多いようですね。

GL 3.0(Not ES)対応のページも探してみました。

opengl-tutorial.org | Tutorials for modern OpenGL (3.3+)

  • 3.3対応のTutorial。

opengl-tutorial.org | Tutorials for modern OpenGL (3.3+)

  • 日本語版もある!

An intro to modern OpenGL. Table of Contents

Learning Modern 3D Graphics Programming

  • この2つも3.x系対応(らしい)

Shaderific

  • iOS上でShaderLanguageの開発ができるアプリ(有料。。)

OpenGL Theory Tutorial: 3D Coordinate System (Camera, Local and World Coordinates, Far and Near Clipping Planes)

  • OpenGL Tutorial。最新かどうかは不明な感じ。。Lightingが図で説明されているのでわかりやすいかも

http://nehe.gamedev.net

  • ここは古いようだ

RGB,IR,Depth画像を保存する

概要

  • Kinect v2から取得した画像(RGB,IR,Depth)を保存する。
  • 以下、普通のOpenCVの内容です。

OpenCVを利用して画像を保存する

  • ”R"を押したらRGB画像を保存
  • "I"を押したらIR画像を保存
  • "D"を押したらDepth画像を保存
Diff

save image on key

Point
  • cv::imwrite()は8ビット画像を入力してあげる必要がある。

  • IRとDepthはconvertToを使って8ビットに変換する。(そのままimwriteすると真っ黒画像が出来上がります)

反省点*1*2

*1:普通のOpenCVの内容だった

*2:Protonect.cppを直接編集するという手抜き感が出てしまった

libfreenect2検証その2

前回の日記で検証したlibfreenect2の続き。

filterはenable?

https://gist.github.com/treaded/0aa817cd9194561178e6

でfilter切ったけど、切らなくてもよくね?ってことで再検証

OpenCL

https://gist.github.com/treaded/0aa817cd9194561178e6#file-opencl_depth_packet_processor-cpp-diff

をenableに戻す

  • 結果

CPU負荷はほとんど変わらず(どちらも200%)

Filterなし

f:id:hcresc:20141214133119p:plain

Filterあり

f:id:hcresc:20141214133241p:plain

左の山がFilterなし、右がFilterあり

f:id:hcresc:20141214133255p:plain

ただ、Filterありの場合のほうが、コンソールに出力される [RgbPacketStreamParser::handleNewData] skipping rgb packet!が多い気がする。。

CPU

割愛

MacBook Pro Retina で Kinect for Windows v2 を認識させる

開発環境

開発マシン
センサーデバイス
  • Kinect for Windows v2 センサー本体(今回はXBOX ONE同梱のものを使用)
  • PC用アダプター(Microsoftストアで売ってます)

事前準備

C++コンパイルできる環境を準備しておく(その他開発に必要なものもインストール)

インストール

OpenKinect/libfreenect2 · GitHub

READMEにある通りに依存パッケージをインストール。

brew update
brew tap homebrew/science
brew install opencv git nasm wget

git clone した後、いくつかファイルを修正する。

./depends/install_mac.sh

ディレクトリ名がおかしいので修正する。

開発環境準備#1

./examples/protonect/

includeを修正

include 修正

ここまででコンパイルまでは通るはず

sh ./depends/install_mac.sh

cd ./examples/protonect/
cmake CMakeLists.txt
make && make install

 実行してみる

./bin/Protonect

RGB画像は取得できるが、IRとDepth(深度)画像は真っ黒。。。

OpenGLDepthPacketProcessor not working on Intel GPUs (Mac/OS X) · Issue #31 · OpenKinect/libfreenect2 · GitHub

Intel Iris でOpenGLDepthPacketProcessorがうまく動いていない様子・・

CPUかOpenCLであれば認識できるようなので、そちらを試してみる。

DepthPacketProcessorの変更

OpenGLDepthPacketProcessor から CpuDepthPacketProcessor または OpenCLDepthPacketProcessor に変更する(packet_pipeline.h)

ついでに処理の重いFilterを切っておく ({opencl,cpu}_depth_packet_processor.cpp)

DepthPacketProcessorの変更

再び実行する

CPUだと15Hzくらい@フル回転

OpenCLの場合は95Hz〜@CPU使用率50%超くらい

f:id:hcresc:20141207191536p:plain

OpenCLであれば他の処理もできそうかな、という感じ