こちらのサイトの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 の顔検出アプリを一から作ってみる