こちらのサイトのNyARToolkit + NyMMDのソースをベースにして、NyARToolkitの部分を分離してみました。
NyARToolkit project

で、NyARToolkitの代わりにOpenCV android-sdkの2.3.1と2.4.6(Face Detectionのサンプル)を使用してみます。

マーカーレス・トラッキングに対応するためです。

サンプルでは、lbpcascadeが使われていますが、haarcascadeでもいいです。

上記のソースからNyARToolkit系のパッケージを外してみたら、基本的には

jp.androidgroup.nyartoolkit.sketch

jp.androidgroup.nyartoolkit.utils.gl
(ただし、この中のNyARGLUtil.javaは不要)

およびjp.nyatla.nymmd系のパッケージがあればOKということが分かりました。

新規プロジェクトのエントリには、jp.nyatla.andnya3のAndMmdActivity.javaのコードを使います。

カメラも外しています。カメラについては基本OpenCVのコードに書かれているいるものを使用する予定です(うまくいくかどうかは未だわかりませんが)。

現段階ではまだNyMMDのみでミクさんがご挨拶しています(単にお辞儀してるだけです....)。

こんな感じ。

ランドスケープ


ポートレート


ランドスケープとポートレートの切り替えは画面隅の緑色のボタン(のようなもの)をタップして行います。

ランドスケープとポートレートの切り替えはセンサー対応にしました。

OpenCVとの連携部分は、以下のように検出した場合とロストした場合に分けて行う予定。



これは単なるログ。これが吐き出されたところでミクさん登場のフラグを立てます。

フラグ処理にしているのは、OpenGLによる描画は基本シングルスレッドなので、描画中に他のメソッドをコールできないから。

ミクさんを登場させるには、NyMMDのupdateMotion関数を有効にするかどうか...です。

07-12 19:52:15.647: E/FACE(23769): ロストしました!
07-12 19:52:15.827: E/FACE(23769): 検出!
07-12 19:52:16.037: E/FACE(23769): 検出!
07-12 19:52:16.207: E/FACE(23769): 検出!
07-12 19:52:16.467: E/FACE(23769): ロストしました!
07-12 19:52:16.597: E/FACE(23769): ロストしました!


OpenCV 2.4.6 android-sdkのサンプル(OpenCV Sample - face-detection)ですが、新規プロジェクトから作成する場合、

EclipseでJNIプロジェクトにしなければならないみたい....ちと面倒。

DetectionBasedTracker.javaがネーティブコードと連携しているようで、サンプルをコピーするというわけにいかない。

jniフォルダーの中のヘッダーファイルには「おれに触るな」みたいなことが書いてあるし.....。




2.4.6は面倒そうなので、とりあえず、まずは2.3.1で作ってみました。

こんな感じ。

遠藤選手が検出されたら、ミクさんが現れてご挨拶します(別にヤットでなくてもいいんですが)。



2.3.1の検出率の低さは何というか...泣きそうになります、カスケードを変えたほうがいいかも。
時々、顔でもなんでもないところを、顔だと思って検出する場合もあるし。
この問題は、カスケードをいくつか組み合わせることで、少しは改善できるので次回バージョンではロジックを組み込む予定。

顔と鼻の2つを検出した場合は、こんな感じ。
こうすると、顔と鼻が同時検出されたなら、それは顔である確度が高い....と言えそう?。
それと、顔の中の他のパーツの位置も推測できます(おおまかですけど)。



触っているうちに気がついたのですが、2.3.1ってportraitよりlandscapeの方が検出率がいいような気が...。

これって、どこかに書いてるのかな?

landscapeにすると、こんな風にちゃんと顔を矩形で囲ってくれます。
(ただ顔じゃないのも、きっちり検出してますけど)



作り方の詳細は後日に譲るとして、ざっと説明します。

新規プロジェクトを作成する際は、まずNyMMDオンリーのものを先に作っておきます。

次に2.3.1のサンプルソースをベースにこのプロジェクトに移植していきます。

これはActivityの作り方が両者で異なるので、先にNyMMDを作っておいたほうがやりやすいからです。

で、最も肝心な部分はViewの設定です。

2つのアプリを合体させるので、viewは2つあります。

ミクさんを描画するOpenGLのviewと、OpenCVの顔検出のviewです。

まず先にOpenGLのviewをセットしておいて、その後で2.3.1のFdViewを追加します。

こうしておかないと、逆の場合OpenCVのカメラビューの後ろでミクさんが描画されるみたいです。

ということで、詳細は後日(2.4.6と重なるかも....)。




OpenCV 2.3.1のアプリをバージョンをアップしました(2013/07/22)。

顔検出の精度向上
カスケードを複数使って精度向上をやろうとしましたが、とてつもなく重くなりました(FPSが1以下)、ので中止。
精度向上のロジック自体に問題は無かったので、今後CPUのパフォーマンスが上がれば復活の予定。PC版にすれば使えるかもしれない...。

ミクさんの位置・角度修正
ミクさんがターゲットを追跡しながら、ご挨拶します。

こんな感じ。



顔が検出されたら、そっちの方を向きます(現在はバックカメラにのみ対応)。



右向いて、ご挨拶。
写真の女性は怒っているように見えるかもしれませんが、もともとそういうお顔です。



顔の矩形が移動すれば、それに追随してミクさんの向きが変わります。
左向いて、ご挨拶。



うまく顔検出できない場合は、メニュでFace sizeをどれか指定してみてください。





工事中(under construction)






OpenCV 2.4.6の場合

プロジェクトをビルドするのに、Cygwinを使います。

Cygwin

OpenCV 2.4.6についてこのページ参照
AndroidでOpenCV 2.4.6を使ってみる

で、Androidのプロジェクトへ、C++のMakeFileプロジェクトを追加する、という段取りになると思います。

その後、jniフォルダーを追加してここにmkファイルやcppのソースファイルを置いていく...という感じ。
(でもヘッダーファイルはどの時点で作成されるんかね?)

その後、jniの中身をndkでビルドしてobjを作成する...と。

詳細はこちら。まずは2.4.6の顔検出です。
Android OpenCV 2.4.6 の顔検出アプリを一から作ってみる

2.4.6の構成を見ていると、どうも次のNyMMD_OpenCV246は、2.3.1の時と違って2.4.6をベースにしてNyMMDを追加する形になりそう。
(別にそんな必要もなさそうでした)

そのためには、NyMMD単体の階層構造を変えとかないといけないかも。jp.androidgroupをメインパッケージに吸収する感じです。

こんな感じ。

今回は2.3.1と少しロジックを変更しました。Viewの設定が2.3.1と同じにはできなかったもんで(力不足です)。

そのせいか、タブレット(datab01 Android 4.1.2)では動作しましたが、スマホ(Xperia acro Android 2.3.4)ではうまく動きませんでした。

OpenCV 2.4.6 + NyMMD





工事中(under construction)




サンプルアプリですので、インストール・実行は自己責任でお願いします。
何か不具合が起こっても責任取れませんし取りません、ヨロシク。



インストール

Target:Android 2.3.3 or later

動作確認実機:Xperia acro(docomo) Android 2.3.4、datab01(docomo) Android 4.1.2

landscape/portraitの切り替えはセンサー対応に変更しました

ミクさんが単にご挨拶するだけのバージョン



NyMMD + OpenCV 2.3.1の顔検出バージョンです。
無事検出されるまで忍耐強くお待ちください(landscapeならいいかも)

現在このアプリはタブレット(3.0以上?)では動作しません。2.4.6にアップするまでお待ちください。
タブレットにインストールして動作しない場合は、アンインストールしてください。
戻るキーなどで終了させた場合、カメラが開放されず、他のカメラアプリが動作しない場合がおこります。








NyMMD + OpenCV 2.4.6の顔検出バージョンです。

動作確認実機:Xperia acro(docomo) Android 2.3.4、datab01(docomo) Android 4.1.2

現在このアプリはタブレット(dtab01 Andorid 4.1.2)でしか動作確認できていません。

先にGooglePlayで、OpenCV Managerをインストールしておいてください。

また、起動時にミクさんが消えてしまったら再起動してください。



アプリをQRコードからインストールする方法はコチラを参照


タブレットの場合

QRコードでダウンロードすると、Downloadフォルダー内でzipファイルになってインストールできない状態の場合があります。

その場合は、拡張子のzipをapkに変更してファイル名をタップすればインストール用のダイアログが出ますので、そこからインストールしてください。




他のOpenCV関連ページ

OpenCV覚書

矩形領域の座標を取得するページ

OpenCV 2.3.1でカスケードを作って、Androidで使ってみる

アンドロイドでOpenCV(お顔の検出)

アンドロイドでOpenCV(色検出)

アンドロイドでOpenCV(特徴点検出)

Android OpenCV 2.3.1で画像認識

AndroidでOpenCV 2.4.6を使ってみる

Android OpenCV 2.4.6 の顔検出アプリを一から作ってみる