Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2011-05-08

アニメ顔検出ライブラリ AnimeFace を android で動かしてみる

| 21:17 | アニメ顔検出ライブラリ AnimeFace を android で動かしてみる - NaN days を含むブックマーク はてなブックマーク - アニメ顔検出ライブラリ AnimeFace を android で動かしてみる - NaN days

d:id:ultraist さんの Imager::AnimeFaceAndroid 上で動かしてみた話です。ほんとうに動かしてみただけなので実用には向きません……

https://github.com/motemen/android-AnimeFaceDemo をコンパイル (または apk をダウンロード) して実行すると画像を選択するよう促されるので、適当な美少女画像を選んで数分(笑)待つとこんな風に検出します。

f:id:motemen:20110502025333p:image

もともとのライブラリは C で書かれているので Android NDK というのを使って、Java 側から C のコードを呼び出します。C のコード自体は (Imager::AnimeFace をぱくって) すんなり書けたのですが、Android.mk (Makefile 的なもの) を書くのに難儀した。

コンパイル方法

  • http://developer.android.com/sdk/ndk/index.html から NDK をインストール。homebrew なら android-ndk で入ります。
  • http://anime.udp.jp/imager-animeface.html からソースコード nvxs-1.0.2.tar.gz をダウンロードして適当な場所に展開。
  • cd CLAPACK/F2CLIBS/libf2c して make arith.h sysdep1.h signal1.h で一部のヘッダファイルを作る
  • 環境変数 NVXS_ROOT に nvxs を展開したディレクトリをセットして AnimeFaceDemo のルートで ndk-build
    • これで libs/armeabi/libnvxs-bridge.so ができる
  • Eclipse か何かでアプリをコンパイル

以上です。

jni/Android.mk

https://github.com/motemen/android-AnimeFaceDemo/blob/master/jni/Android.mk

NDK ではここにコンパイル手順などを書いておくことになっているみたいです (ndk-build がこのファイルを参照する)。NDK にドキュメントが付属してるはずなので読むとある程度わかるけど、マクロなどは http://android.git.kernel.org/?p=platform/build.git;a=blob;f=core/definitions.mk とかから実例を真似するのが手っ取り早いかと。

Java から呼び出すライブラリは共有ライブラリとしてコンパイルします (include $(BUILD_SHARED_LIBRARY))。nvxs は CLAPACK というライブラリにも依存しているので、これらを静的ライブラリとしてコンパイルして (include $(BUILD_STATIC_LIBRARY))、リンク (LOCAL_LDLIBS := ...) するようにしています。最初は各ライブラリごとに別々の Android.mk を用意していたけどどうせひとつだしこっちのほうが楽。

LOCAL_STATIC_LIBRARIES ってのが何を意味するかよく分かってないんだけど依存関係の指定っぽい?

その他

"undefined reference to ..." 的なエラーが出るときは NDK に含まれる nm (自分の場合は /usr/local/Cellar/android-ndk/r5b/toolchains/arm-eabi-4.4.0/prebuilt/darwin-x86/arm-eabi/bin/nm) などでシンボルを確認するといいみたいです。

参考リンク