2011年8月22日月曜日

OpenCVバイナリのライブラリを用いたサンプルでエラー

日本Androidの会京都支部8月集会に行ってきました。
http://atnd.org/events/18798

そこで、mt_uenoさんにOpenCVのハンズオンをしてもらいました。
最新版はバイナリで配布されているとのことです。以下のサイトに最新版があります。
"Open Computer Vision Library - Browse /opencv-android/2.3.1 at SourceForge.net":http://bit.ly/qgBOtO
資料とOpenCVの最新版をUSBメモリで配布していただき、
各人でOpenCVをEclipseにインポートしてサンプルが動くか確認しました。
が、しかし動きません!
Nexus S(2.3.4)で強制終了エラー

OpenCVの2011年8月の最新バージョンは、Ver.2.31beta2ということで、JavaAPIが大幅に拡張されたそうです。ただし、API Levelが8以上なので2.2以降のAndroid端末しか適用されません。
私のAndroidは2.3.4のNexus Sなので、そのままうまく動くかな?と思いましたが、サンプルプログラムを実行させるとエラーがでました。
チュートリアル用の2つのプログラムを試しました。
  • 0. Android Camera(カメラ画像取得・表示するもの) 
  • 1. Add OpenCV(カメラ画像を簡単に画像処理するもの) 
「0. Android Camera」はOpenCVを使わず素のAndroidのカメラ機能を使う物で、うまく動きました。
「1. Add OpenCV」はOpenCVを使いカメラ機能を使う物で、これは起動時に即、異常終了します。

バイナリで提供されるライブラリという事で、プラットフォームの違いによる問題も考えられそうですが、ライブラリは(AndroidのCPUである)ARMをターゲットとしてビルドされているので、MacでもWindowsでもLinuxでもEclipse上では変わりないとこことでした。

以下に異常終了が起きたときのLogCatを入れておきます。
気になるWARNINGやERRORにハイライトを入れています。
08-21 23:11:13.785: INFO/ActivityManager(109): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=org.opencv.samples.tutorial1/.Sample1Java } from pid 194
08-21 23:11:13.847: INFO/ActivityManager(109): Start proc org.opencv.samples.tutorial1 for activity org.opencv.samples.tutorial1/.Sample1Java: pid=10985 uid=10075 gids={1006}
08-21 23:11:13.890: INFO/WindowManager(109): Setting rotation to 1, animFlags=1
08-21 23:11:13.894: INFO/ActivityManager(109): Config changed: { scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=43}
08-21 23:11:13.914: VERBOSE/RenderScript_jni(194): surfaceDestroyed
08-21 23:11:13.960: INFO/Sample::Activity(10985): Instantiated new class org.opencv.samples.tutorial1.Sample1Java
08-21 23:11:13.960: INFO/Sample::Activity(10985): onCreate
08-21 23:11:13.964: INFO/Sample::SurfaceView(10985): Instantiated new class org.opencv.samples.tutorial1.Sample1View
08-21 23:11:13.992: INFO/ActivityManager(109): Displayed org.opencv.samples.tutorial1/.Sample1Java: +147ms
08-21 23:11:14.058: INFO/Sample::SurfaceView(10985): surfaceCreated
08-21 23:11:14.070: ERROR/SecCamera(75): initCamera: m_cam_fd(15), m_jpeg_fd(0)
08-21 23:11:14.070: INFO/SecCamera(75): Name of input channel[0] is S5K4ECGX
08-21 23:11:14.078: ERROR/SecCamera(75): initCamera: m_cam_fd2(21)
08-21 23:11:14.078: INFO/SecCamera(75): Name of input channel[0] is S5K4ECGX
08-21 23:11:14.078: INFO/SecCamera(75): Name of input channel[0] is S5K4ECGX
08-21 23:11:14.078: INFO/StagefrightPlayer(75): setDataSource('/system/media/audio/ui/camera_click.ogg')
08-21 23:11:14.082: INFO/CameraHardwareSec(75): int android::CameraHardwareSec::previewThreadWrapper(): starting
08-21 23:11:14.082: INFO/CameraHardwareSec(75): int android::CameraHardwareSec::previewThreadWrapper(): calling mSecCamera->stopPreview() and waiting
08-21 23:11:14.082: WARN/SecCamera(75): int android::SecCamera::stopPreview(): doing nothing because m_flag_camera_start is zero
08-21 23:11:14.085: INFO/StagefrightPlayer(75): setDataSource('/system/media/audio/ui/VideoRecord.ogg')
08-21 23:11:14.093: INFO/Sample::SurfaceView(10985): surfaceCreated
08-21 23:11:14.097: DEBUG/Camera(10985): app passed NULL surface
08-21 23:11:14.171: INFO/Sample::SurfaceView(10985): Starting processing thread
08-21 23:11:14.835: DEBUG/CameraHardwareSec(75): MemoryHeapBase(fd(15), size(5702576), width(720), height(480))
08-21 23:11:14.839: INFO/CameraHardwareSec(75): int android::CameraHardwareSec::previewThreadWrapper(): return from wait
08-21 23:11:14.851: WARN/dalvikvm(10985): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/core/Mat;
08-21 23:11:14.890: DEBUG/AndroidRuntime(10985): Shutting down VM
08-21 23:11:14.890: WARN/dalvikvm(10985): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985): FATAL EXCEPTION: main
08-21 23:11:14.894: ERROR/AndroidRuntime(10985): java.lang.ExceptionInInitializerError
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at org.opencv.samples.tutorial1.Sample1View.surfaceChanged(Sample1View.java:31)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.SurfaceView.updateWindow(SurfaceView.java:549)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.View.draw(View.java:6883)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.View.draw(View.java:6883)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewRoot.draw(ViewRoot.java:1522)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1258)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.os.Looper.loop(Looper.java:130)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at android.app.ActivityThread.main(ActivityThread.java:3683)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at java.lang.reflect.Method.invokeNative(Native Method)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at java.lang.reflect.Method.invoke(Method.java:507)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at dalvik.system.NativeStart.main(Native Method)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at java.lang.System.loadLibrary(System.java:554)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     at org.opencv.core.Mat.<clinit>(Mat.java:2065)
08-21 23:11:14.894: ERROR/AndroidRuntime(10985):     ... 23 more
08-21 23:11:14.898: WARN/ActivityManager(109):   Force finishing activity org.opencv.samples.tutorial1/.Sample1Java
08-21 23:11:14.957: DEBUG/dalvikvm(109): GC_EXPLICIT freed 124K, 54% free 6304K/13447K, external 3355K/3708K, paused 48ms
08-21 23:11:14.960: INFO/WindowManager(109): Setting rotation to 0, animFlags=1
08-21 23:11:14.976: INFO/ActivityManager(109): Config changed: { scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=44}
08-21 23:11:15.097: DEBUG/dalvikvm(109): GC_EXTERNAL_ALLOC freed 23K, 54% free 6300K/13447K, external 3394K/3708K, paused 49ms
08-21 23:11:15.480: WARN/ActivityManager(109): Activity pause timeout for HistoryRecord{40694918 org.opencv.samples.tutorial1/.Sample1Java}
08-21 23:11:15.523: VERBOSE/RenderScript_jni(194): surfaceCreated
08-21 23:11:15.523: VERBOSE/RenderScript_jni(194): surfaceChanged
08-21 23:11:17.195: DEBUG/dalvikvm(109): GC_EXPLICIT freed 29K, 53% free 6321K/13447K, external 3750K/4672K, paused 98ms
08-21 23:11:25.945: WARN/ActivityManager(109): Activity destroy timeout for HistoryRecord{40694918 org.opencv.samples.tutorial1/.Sample1Java}
08-21 23:12:07.996: DEBUG/dalvikvm(3554): GC_EXPLICIT freed 198K, 67% free 4146K/12423K, external 1625K/2137K, paused 71ms
08-21 23:13:56.535: DEBUG/dalvikvm(3554): GC_EXPLICIT freed 241K, 67% free 4165K/12423K, external 1625K/2137K, paused 39ms 
//TODO LogCatテキストのハイライトはできないかな。
以下、上記LogCatの画像です。
(クリックして拡大)
mt_uenoさんと@scarvizさんは動いていました。二人とも2.2のAndroidケータイでしたので、2.2のAndroidでないと動かないのかもしれません。Android上のバイナリがAndroidのバージョンに影響されることはあり得ます。通常上位コンパチで2.2のバイナリなら2.3.4のAndroidで動いてほしいのですが…。

5 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. Eclipseの、プロジェクトのプロパティで、Androidタブのところで、ライブラリの指定が多分うまくできてないんではないでしょうか?(パスがおかしい)
    私も最初起動直後動作しませんでしたが、そこを直したら、動作しました。Garaxy Tabです。

    返信削除
  3. 上記、
    08-21 23:11:14.894: ERROR/AndroidRuntime(10985): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null

    とあるので、ライブラリがリンクされてないということかと思います。プロジェクトのプロパティを確認してみてください。ライブラリのところで×印がついていると思います。

    返信削除
  4. adachi_cさん

    ご指摘の部分を見直し、正常に動作しました!
    プロジェクトのプロパティからライブラリの部分を見ると
    ご指摘の通り×がついていました。
    ライブラリを選択し直しサンプルが動作するようになりました。

    手順によってなぜ×がつくのかもわかりましたので、
    あらためてブログで記事にしたいと思います。

    ありがとうございましたーm(_ _)m

    返信削除
  5. yoshikenさん

    正常動作するようになったとのことで,おめでとうございます。

    > 手順によってなぜ×がつくのかもわかりましたので、
    > あらためてブログで記事にしたいと思います。
    再現方法もばっちりですか!!
    記事になるのを心待ちにしておきます。

    返信削除