(今日はちゃんとサンプル以外のも動かせたので成果ありです)
参考にするページはいつもの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
エミュレータでは動作しない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。
こんな感じの画像になります。
ではまた。
0 件のコメント:
コメントを投稿