2011/02/21

AndroidでOpenCV1.1を動かす(2)

前回の続き。

OpenCV1.1の準備
3.OpenCV 1.1pre1 のソースコードをダウンロードして適当なところに展開します。
4.フォルダの中にある、cvフォルダとcxcoreを、jniフォルダの中に移動させます。

5.Android.mkファイルを作成します。
Android.mkファイルの内容は下記のとおりです。

LOCAL_PATH:= $(call my-dir)

##############
##   OpenCV
##############

include $(CLEAR_VARS)
#cxcore
LOCAL_MODULE    := cxcore

#includeファイルの場所を指定
LOCAL_C_INCLUDES := \
       $(LOCAL_PATH)/cv/include \
    $(LOCAL_PATH)/cxcore/include


LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl

#ソースファイルを指定(cxcoreフォルダにあったソースを全部登録)
LOCAL_SRC_FILES := \
        cxcore/src/cxalloc.cpp \
        cxcore/src/cxarithm.cpp \
        cxcore/src/cxarray.cpp \
        cxcore/src/cxcmp.cpp \
        cxcore/src/cxconvert.cpp \
        cxcore/src/cxcopy.cpp \
        cxcore/src/cxdatastructs.cpp \
        cxcore/src/cxdrawing.cpp \
        cxcore/src/cxdxt.cpp \
        cxcore/src/cxerror.cpp \
        cxcore/src/cximage.cpp \
        cxcore/src/cxjacobieigens.cpp \
        cxcore/src/cxlogic.cpp \
        cxcore/src/cxlut.cpp \
        cxcore/src/cxmathfuncs.cpp \
        cxcore/src/cxmatmul.cpp \
        cxcore/src/cxmatrix.cpp \
        cxcore/src/cxmean.cpp \
        cxcore/src/cxmeansdv.cpp \
        cxcore/src/cxminmaxloc.cpp \
        cxcore/src/cxnorm.cpp \
        cxcore/src/cxouttext.cpp \
        cxcore/src/cxpersistence.cpp \
        cxcore/src/cxprecomp.cpp \
        cxcore/src/cxrand.cpp \
        cxcore/src/cxsumpixels.cpp \
        cxcore/src/cxsvd.cpp \
        cxcore/src/cxswitcher.cpp \
        cxcore/src/cxtables.cpp \
        cxcore/src/cxutils.cpp

include $(BUILD_STATIC_LIBRARY)




include $(CLEAR_VARS)

LOCAL_MODULE    := cv
LOCAL_C_INCLUDES := \
       $(LOCAL_PATH)/cv/include \
    $(LOCAL_PATH)/cxcore/include

LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl

LOCAL_SRC_FILES := \
        cv/src/cvaccum.cpp \
        cv/src/cvadapthresh.cpp \
        cv/src/cvapprox.cpp \
        cv/src/cvcalccontrasthistogram.cpp \
        cv/src/cvcalcimagehomography.cpp \
        cv/src/cvcalibinit.cpp \
        cv/src/cvcalibration.cpp \
        cv/src/cvcamshift.cpp \
        cv/src/cvcanny.cpp \
        cv/src/cvcolor.cpp \
        cv/src/cvcondens.cpp \
        cv/src/cvcontours.cpp \
        cv/src/cvcontourtree.cpp \
        cv/src/cvconvhull.cpp \
        cv/src/cvcorner.cpp \
        cv/src/cvcornersubpix.cpp \
        cv/src/cvderiv.cpp \
        cv/src/cvdistransform.cpp \
        cv/src/cvdominants.cpp \
        cv/src/cvemd.cpp \
        cv/src/cvfeatureselect.cpp \
        cv/src/cvfilter.cpp \
        cv/src/cvfloodfill.cpp \
        cv/src/cvfundam.cpp \
        cv/src/cvgeometry.cpp \
        cv/src/cvhaar.cpp \
        cv/src/cvhistogram.cpp \
        cv/src/cvhough.cpp \
        cv/src/cvimgwarp.cpp \
        cv/src/cvinpaint.cpp \
        cv/src/cvkalman.cpp \
        cv/src/cvlinefit.cpp \
        cv/src/cvlkpyramid.cpp \
        cv/src/cvmatchcontours.cpp \
        cv/src/cvmoments.cpp \
        cv/src/cvmorph.cpp \
        cv/src/cvmotempl.cpp \
        cv/src/cvoptflowbm.cpp \
        cv/src/cvoptflowhs.cpp \
        cv/src/cvoptflowlk.cpp \
        cv/src/cvpgh.cpp \
        cv/src/cvposit.cpp \
        cv/src/cvprecomp.cpp \
        cv/src/cvpyramids.cpp \
        cv/src/cvpyrsegmentation.cpp \
        cv/src/cvrotcalipers.cpp \
        cv/src/cvsamplers.cpp \
        cv/src/cvsegmentation.cpp \
        cv/src/cvshapedescr.cpp \
        cv/src/cvsmooth.cpp \
        cv/src/cvsnakes.cpp \
        cv/src/cvstereobm.cpp \
        cv/src/cvstereogc.cpp \
        cv/src/cvsubdivision2d.cpp \
        cv/src/cvsumpixels.cpp \
        cv/src/cvsurf.cpp \
        cv/src/cvswitcher.cpp \
        cv/src/cvtables.cpp \
        cv/src/cvtemplmatch.cpp \
        cv/src/cvthresh.cpp \
        cv/src/cvundistort.cpp \
        cv/src/cvutils.cpp

include $(BUILD_STATIC_LIBRARY)



####################
## 各プロジェクト用
###################


include $(CLEAR_VARS)

LOCAL_MODULE    := cvtest
LOCAL_C_INCLUDES := \
      $(LOCAL_PATH)/cv/include \
    $(LOCAL_PATH)/cxcore/include \
    
LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog \
                -L$(TARGET_OUT) -lcxcore -lcv

LOCAL_SRC_FILES := cvtest.cpp

LOCAL_STATIC_LIBRARIES := cxcore cv

include $(BUILD_SHARED_LIBRARY)



ライブラリのビルド
プロジェクトフォルダのトップに移動して、ndk-buildを実行します。
opencvのライブラリもビルドされるので、最初は5分〜10分かかりますが、
それ以後は数秒で終わります。


ライブラリのビルドが終わると、


.
.
Compile++ thumb  : cv <= cvswitcher.cpp
Compile++ thumb  : cv <= cvtables.cpp
Compile++ thumb  : cv <= cvtemplmatch.cpp
Compile++ thumb  : cv <= cvthresh.cpp
Compile++ thumb  : cv <= cvundistort.cpp
Compile++ thumb  : cv <= cvutils.cpp
StaticLibrary  : libcv.a
SharedLibrary  : libcvtest.so
Install        : libcvtest.so => libs/armeabi/libcvtest.so

といった形でlibsフォルダにライブラリがコピーされ、Androidに組み込める状態になります。
あとはeclipseでプロジェクトを更新(F5キー)し、Androidプロジェクトを実行すればOKです。

ソースコード一式は、別館の方に保存してあります。

ではまた。

5 件のコメント:

  1. 初めまして。rokuと申します。
    最近OpenCVを勉強し始めました。Androidも開発も行っているのでこちらのコードを参考にさせていただいてAndroid上でopenCVを動かそうと思ったのですが、ライブラリのビルドがうまく通りません。。。
    cannot find -lcxcore
    とメッセージが出るのでmkファイルの150行目がひっかかっているのかと思うのですが、解決方法がわかりません。(TARGET_OUT の部分?)
    もし原因がお分かりになりましたら教えていただけませんか?よろしくお願いいたします。

    返信削除
  2. >>rokuさん

    150行目の-L$(TARGET_OUT) -lcxcore -lcvは、
    コンパイルしたライブラリの出力先(プロジェクトフォルダ/obj/local/armeabi/)にあるcxcoreとcvを読み込ませる命令となっています(たぶん)
    (-Lはフォルダ、-lはライブラリを表します)

    確認項目ですが、下記の3点をチェックしてみてください。
    1.ライブラリ名はcxcoreとcvになっているか
    2.ndk-buildを実行した際に、cxcore -> cv ->その他といった順番でコンパイルされているか
    3.プロジェクトフォルダ/obj/local/armeabi に libcv.aやlibcxcore.aがあるか

    返信削除
  3. はじめまして。みつ といいます。

    私のところでもrokuさんと全く同じです。
    >1.ライブラリ名はcxcoreとcvになっているか
     これはどこかで確認できますでしょうか。
     3 でlibcxcore.a libcv.a ができているのでOKと思っています。

    >2.ndk-buildを実行した際に、cxcore -> cv ->その他といった順番でコンパイルされているか


    >3.プロジェクトフォルダ/obj/local/armeabi に libcv.aやlibcxcore.aがあるか
     これはあります。

    検索してみても、「ライブラリがフォルダにないからロードするようにライブラリを配置」というような記述で、具体的に何をするかがいまいちです。

    いったんオブジェクトを削除(クリーン)してからやってもダメでした。

    返信削除
  4. >>みつ さん
    cvとcxcoreを共有ライブラリでビルドする方式に変えたものを別館の方に保存しておきました。こちらのバージョンでビルドできるかをためしてみてください。

    また、Android.mkファイルで使う変数については、下記ページを参照ください(私も参考にしてます)
    Android NDK:kwLog
    http://blog.makotokw.com/memo/android/android-ndk/

    返信削除
  5. どうも、みつです。

    結論から言うと、ライブラリの入れ替えなどをやったらビルドできました。

    「など」と書いているのは、仕方なく?
    OpenCV2.2 の環境設定を試してみたら、苦労したものの、そちらがうまくいって、その後に、1.1のほうもやってみたらうまくいったということです。

    その際、NDK を r5b から、r4 の 標準でない?バージョンに入れ替えました。
    (あと、r5b は C 直下においていましたが、
     r4 は、気持ち悪かったですが推奨の cygwin/home/ユーザーの下に入れたので、そのあたりが関係していると思います)

    2.2については以下のサイトを、
    http://team-hiroq.com/blog/android/android_opencv_setup_environment.html

    を参考にしました。

    お手数おかけしました。

    返信削除