Kinectを使ったモジュール開発
とても久しぶりの更新です。
4月から新社会人になりました。
いきなりの自己紹介ですが・・・
3月まで大学院で、研究でシステム開発をしていました。
内容は、大まかに言うと、Kinectを利用した人物検出モジュールの開発です。
今回の記事では、開発の時によくわからなかったなぁということを書いていきます。
開発環境は
SDK:Kinect for Windows SDK v1.0
デバイス:Kinect for Windows
言語:C++
です。
Kinectを使った開発ではいろいろと苦労しました。
今回の研究の中で、なるほど!と思ったのをメモとして残しておきます。
まず、一つ目。
Kinectが全身の関節情報を取得する基準です。
通常、Kinectは2人までしか全身の関節の座標値を取得しません。
3人目が入ってきた場合、
どうなるかということを、実験しました。
結果はというと・・・
Kinectにより近い位置にいる人物が全身の骨格情報を取得します。
そのため、認識人物がKinectの画角内にいる時間や認識人物のフレームイン順などを基準にしていないことが言えます。
次に、任意の人物を選択するということです。
KinectのC++版には、人物の認識(追跡)IDを保持する変数があります。
この変数に対して何らかの処理をすることで、開発者が指定する任意人物の全身の骨格情報を保持することが可能になります。
私は、Kinectの画角内にフレームインしてきた人物順に全身の骨格情報を取得する処理を行いたかったです。ですが、なかなか上手くいきませんでした。なので、試行錯誤しながら、考えた内容を書いていきます。
まず最初に、Skeleton Data[0~6]に格納されている認識(追跡)IDを0~6の順番に処理をしていけば、フレームインしてきた人物を処理対象にできると考えました。
(Skeleton Data[0~6]に順番に格納され、Skeleton Data[6]に値が入ったら、Skeleton Data[0]の値が上書きされると予想していました。)
しかし、認識(追跡)IDは、Skeleton Data[0~6]の配列に対して0、1、2・・・と順に認識(追跡)IDが格納されるのではなく、5、3、0・・・などと不規則にID番号が格納されます。(この格納方法に基準はありません。)
次に、認識(追跡)IDの値を基にフレームインしてきた人物を選択すればいいと考えました。しかし・・・
認識(追跡)ID番号は、Kinectが起動してからカウントされる何らかの整数値であり、数値はどんどん増えていくことが分かりました。なので、認識(追跡)IDの数値=検出された人数ではありません。
これらのことをまとめると、
認識(追跡)IDの値は、検出人数との関連性はない
Skeleton Data[0~6]の配列への認識(追跡)IDの格納方法に規則性はない
ということです。
フレームインしてきた人物を順番に処理対象にすることは難しいと考えました。
そのため、私が考えた解決策として、認識(追跡)IDの値を昇順に並び替えます。そして、最大値と次に大きい値を任意の人物のIDを保持する変数に値を入れます。
そうすることで、認識(追跡)IDが最大値と次に大きい値の人物を選択することで一つ目に上げた、Kinectにより近い人物を検出対象とする問題も解決できます。
上記の処理を行うことで、フレームインしてきた人物を選択することができます。
今回の記事は、うまく説明できない部分もありましたが、以上です。
OpenCV
Visual Studio2010のWindowsフォームアプリケーションで
OpenCV2.3.1のopencv.hを読み込ませようとするとビルドエラーが起こってしまうという問題に悩んでおりましたが、解決!
やり方としては、CMakeをインストールしてやるという方法で、
以下を参照して行いました。
↓
もともとOpenCV2.3.1が入っていたので、
Windows(Win32 Installer)のcmake-2.8.8-win32-x86.exeをダウンロード
インストールが終了したら、管理者として実行をしてサイトを参考に
OpenCV.sln
を作成
※.Slnは名前:VisualStudioソリューションで、各アイテムの場所への参照を開発環境へ提供するもの→参考
そして、ビルドを環境変数を設定して終了
再起動して
VSでWindowsフォームアプリケーションで新しいプロジェクトを作成してopencv.hを読み込ませたらビルドできました。
でも、よくわからないのが、OpenCV2.2の時は、CMakeを使わなくても大丈夫だったというところ。
そして、フォームアプリケーション以外ではopencv.hが読み込めていたという点がわからない。
でも、解決してよかった。
今回初めて使ったので、CMakeについてネットを参考に自分メモを作成
CMakeはビルドを行うためのクロスプラットフォームなシステムらしい→参考
メモ
初期化されていないローカル変数 'ーーーー' が使用されます
openni エラー その2
Skeleton.obj : warning LNK4248: 未解決の typeref トークン (01000011) ('XnInternalNodeData') です。イメージを実行できません。
1>oni05.obj : warning LNK4248: 未解決の typeref トークン (0100001C) ('XnInternalNodeData') です。イメージを実行できません。
1>Form1.obj : warning LNK4248: 未解決の typeref トークン (0100001C) ('XnInternalNodeData') です。イメージを実行できません。
1>Skeleton.obj : warning LNK4248: 未解決の typeref トークン (01000012) ('XnContext') です。イメージを実行できません。
1>oni05.obj : warning LNK4248: 未解決の typeref トークン (0100001D) ('XnContext') です。イメージを実行できません。
1>Form1.obj : warning LNK4248: 未解決の typeref トークン (0100001D) ('XnContext') です。イメージを実行できません。
1>Skeleton.obj : warning LNK4248: 未解決の typeref トークン (01000013) ('XnNodeInfo') です。イメージを実行できません。
1>oni05.obj : warning LNK4248: 未解決の typeref トークン (0100001E) ('XnNodeInfo') です。イメージを実行できません。
1>Form1.obj : warning LNK4248: 未解決の typeref トークン (0100001E) ('XnNodeInfo') です。イメージを実行できません。
1>Skeleton.obj : warning LNK4248: 未解決の typeref トークン (01000016) ('XnNodeInfoList') です。イメージを実行できません。
1>oni05.obj : warning LNK4248: 未解決の typeref トークン (01000021) ('XnNodeInfoList') です。イメージを実行できません。
1>Form1.obj : warning LNK4248: 未解決の typeref トークン (01000021) ('XnNodeInfoList') です。イメージを実行できません。
1>Form1.obj : warning LNK4248: 未解決の typeref トークン (01000024) ('XnEnumerationErrors') です。イメージを実行できません。
1> oni05.vcxproj -> C:\Users\naomi\Desktop\KinectSample_2 - コピー\oni05\Debug\oni05.exe
1>FinalizeBuildStatus:
1> ファイル "Debug\oni05.unsuccessfulbuild" を削除しています。
1> "Debug\oni05.lastbuildstate" のタッチ タスクを実行しています。
1>
ともいわれてしまう><
openni エラー その1
骨格検出するときにビルドしたら出たエラー
c:\opencv2.2\include\opencv2\core\operations.hpp(81): warning C4793: `anonymous namespace'::CV_XADD': ネイティブ関数としてコンパイルされました:
1> インラインのネイティブ アセンブリはマネージ コードでサポートされていません
と言われる