2011/06/23

Android+OpenCV2.3の環境構築に挑戦

OpenCV2.3が出たので、また懲りずにAndroid+OpenCV2.xの環境構築に挑みます。
(今日はちゃんとサンプル以外のも動かせたので成果ありです)

参考にするページはいつものOpenCV公式Wikiです。
Android
Android2.3.0というページが増えてたので、そこを参考にしています。

まずはOpenCV2.3.0をSourceForgeからダウンロードしてきます。
私はOpenCV2.3.0rc.tar.bz2をとってきて解凍しました。
また、その他必要なCMakeと公式AndroidNDKもダウンロードしておきます。

材料が揃ったので、Android用OpenCVのビルドに入ります。

1.ANDROID_NDKとANDROID_NDK_TOOLCHAIN_ROOTをExportする。
ビルドの間だけ有効であれば良いので、./bashrcに書く必要はありません。
これは環境に合わせて設定してください。
(android-toolchainの設定方法は、Android+OpenCV2.2を参考にしてみてください)

2.ライブラリをビルドします。
  • cd opencv/android
  • sh ./scripts/cmake_android_armeabi.sh
  • cd build_armeabi
  • make -j6
  • make install
注意:Wikiに載っているとおりにcmake_android.shを実行してその後ビルドすると、
エミュレータでは動作しないAndroid用OpenCVライブラリが出来上がります。
(cmake_android.shでは、ターゲットがarmeab-v7aで、cmake_android_armeabi.shの場合はターゲットがarmeabiになります。Androidのエミュレータはarmeabiになるので、せっかくビルドが通るようになっても動きませんでした(これでかなりの時間ハマりました))


3.インストールが完了すると、NDK-TOOLCHAIN-ROOTに設定したフォルダの中に、ライブラリがコピーされると思います。
私の場合は、ライブラリは/opt/android-toolchain/user/armeabi/lib、インクルードファイルは/opt/android-toolchain/user/armeabi/includeとなりました。

4.サンプルのHelloAndroidを作成します。
 HelloAndroidというプロジェクトは、Android端末内のコンソールアプリケーションを作るプロジェクトです。Javaは一切出てきません。
また、サンプルの説明ではCMakeを使ってビルドするようですが、CMakeでビルド出来なかったので、ndk-buildでビルド出来ないかいろいろとやってみました。

4.1 まずはopencv/apps/HelloAndroidフォルダ内に、jniフォルダを作ってmain.cppのコピーを放り込みます。
4.2 そのあとjniフォルダの中に、Application.mkファイルを作成します。
Application.mkファイルの中身は以下のとおりです。
#STLを使うのと、ターゲットがarmeabiだということを伝える
#http://opencv.willowgarage.com/wiki/OpenCVAndroidBinariesBuild にApplication.mkのお手本があったのでコピペしました
APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi


4.3 同じくjniフォルダ内にAndroid.mkファイルを作って、以下の内容を書き込みます。
中身は長時間の試行錯誤の上、動作したものです。いらない行があるかもしれません。

LOCAL_PATH := $(call my-dir)
#Android.mkファイルも、Makefileの一種なので、
#タブで整形するとコマンド行と認識されてしまってエラーが出ます。。

include $(CLEAR_VARS)

#ライブラリのフォルダは、各自変更してください。
ANDROID_OPENCV_LIBS:=-L/opt/android-toolchain/user/armeabi/lib -lopencv_contrib -lopencv_calib3d -lopencv_objdetect \
                   -lopencv_features2d -lopencv_imgproc -lopencv_video -lopencv_highgui -lopencv_ml -lopencv_legacy -lopencv_flann -lopencv_core

#ここも同じ。
OPENCV_3RDPARTY_LIBS:=-L/opt/android-toolchain/user/armeabi/share/opencv/3rdparty/lib \
 -llibjpeg -llibpng -llibtiff -llibjasper -lzlib

#includeフォルダも各自変更してください。
LOCAL_C_INCLUDES:=  /opt/android-toolchain/user/armeabi/include

LOCAL_LDLIBS+= $(ANDROID_OPENCV_LIBS) 
LOCAL_LDLIBS+= $(OPENCV_3RDPARTY_LIBS)

LOCAL_MODULE    := helloandroid
LOCAL_SRC_FILES := main.cpp

#OpenCVで使うライブラリ一覧
LOCAL_SHARED_LIBRARIES:= opencv_core opencv_highgui opencv_contrib opencv_calib3d opencv_objdetect \
   opencv_features2d opencv_imgproc opencv_video \
    opencv_ml opencv_legacy opencv_flann libjpeg libpng libtiff libjasper zlib
#include $(BUILD_SHARED_LIBRARY)

#コンソールアプリとして実行するので以下のオプションをつける。
#公式ドキュメントには載っていないので、そのうちなくなってしまうかも?
include $(BUILD_EXECUTABLE)


あとはndk-buildを実行すると、アプリケーションが出来上がります。


kouji@kouji-ubuntu:~/OpenCV-2.3.0/android/apps/HelloAndroid$ ndk-build
Compile++ thumb  : helloandroid <= main.cpp
Executable     : helloandroid
/opt/android-toolchain/user/armeabi/lib/libopencv_core.a(system.o): In function `cv::tempfile(char const*)':
system.cpp:(.text._ZN2cv8tempfileEPKc+0x22): warning: warning: mktemp() possibly used unsafely; consider using mkstemp()
/opt/android-toolchain/user/armeabi/share/opencv/3rdparty/lib/liblibjasper.a(jas_stream.o): In function `jas_stream_tmpfile':
jas_stream.c:(.text.jas_stream_tmpfile+0x44): warning: warning: tmpnam() possibly used unsafely; consider using mkstemp()
Install        : helloandroid => libs/armeabi/helloandroid


あとはAndroid2.1などのエミュレータを起動し、以下のような感じで転送して実行するだけです。

adb push libs/armeabi/helloandroid /data/helloandroid
adb shell
#cd /data
#chmod 755 helloandroid
#./helloandroid
Hello Android!

そのあと、画像が出来て入ればOK。
こんな感じの画像になります。



これで念願のAndroid+OpenCV2.3+ndk-buildの環境が出来ました。

ではまた。

0 件のコメント:

コメントを投稿