【问题标题】:Java openCV - Error while conevrting Bitmap to MatJava openCV - 将位图转换为 Mat 时出错
【发布时间】:2012-03-13 13:26:18
【问题描述】:

我正在使用 Java openCV,我尝试加载照片并在其上运行模板匹配。 模板匹配方法处理 Mat 对象,所以我需要加载图像并将它们转换为 Mat。

我的做法是:

Bitmap i = BitmapFactory.decodeFile("/sdcard/TVguide/Detection/detected.jpg");
image = Utils.bitmapToMat(i);

这样,我从我的 android SD 卡加载照片,并尝试使用 openCV 方法 bitmapToMat 将其转换为 Mat 对象。 问题是在转换时,应用程序崩溃了。

这里是 LogCat:

            03-14 15:15:57.636: W/dalvikvm(1059): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/android/Utils;
            03-14 15:15:57.636: D/AndroidRuntime(1059): Shutting down VM
            03-14 15:15:57.636: W/dalvikvm(1059): threadid=1: thread exiting with uncaught exception (group=0x40015578)
            03-14 15:15:57.640: E/AndroidRuntime(1059): FATAL EXCEPTION: main
            03-14 15:15:57.640: E/AndroidRuntime(1059): java.lang.ExceptionInInitializerError
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at com.marakana.Preview$3.onPictureTaken(Preview.java:191)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at android.hardware.Camera$EventHandler.handleMessage(Camera.java:565)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at android.os.Handler.dispatchMessage(Handler.java:99)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at android.os.Looper.loop(Looper.java:123)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at android.app.ActivityThread.main(ActivityThread.java:3687)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at java.lang.reflect.Method.invokeNative(Native Method)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at java.lang.reflect.Method.invoke(Method.java:507)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at dalvik.system.NativeStart.main(Native Method)
            03-14 15:15:57.640: E/AndroidRuntime(1059): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at java.lang.System.loadLibrary(System.java:554)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     at org.opencv.android.Utils.<clinit>(Utils.java:86)
            03-14 15:15:57.640: E/AndroidRuntime(1059):     ... 10 more
            03-14 15:16:03.472: I/Process(1059): Sending signal. PID: 1059 SIG: 9

我不明白是我做错了什么还是它只是一个错误的 openCV。

谢谢 埃亚尔

【问题讨论】:

    标签: java android opencv bitmap


    【解决方案1】:

    您需要将位图转换为 RGBA 格式:

    Bitmap bmp32 = i.copy(Bitmap.Config.ARGB_8888, true);
    

    其实是Android-OpenCV用户组讨论最多的问题:https://groups.google.com/group/android-opencv/

    OpenCV 主干中已提供此问题的修复程序,并将包含在 OpenCV 的下一版本中。

    您还可以使用 OpenCV API 读取图像:

    Mat image = Highgui.imread("/sdcard/TVguide/Detection/detected.jpg");
    

    【讨论】:

    • 我已经尝试了这两个建议,但它仍然返回相同的 logCat.. 可能与以下行有关:java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
    • UnsatisfiedLinkError 表示您的 .apk 不包含本机二进制文件。您可以解压缩.apk 并检查libopencv_java.so 的存在。 .apk 也可能只有 ARMv7 的二进制文件,而手机有 ARMv5/ARMv6 CPU。
    • 手机是三星Galaxy S,相信应该可以用,因为有同学用过同样的手机和openCV。我不太明白.apk 是什么意思,但是当我转到 C:\Development\OpenCV-2.3.1\libs\armeabi-v7a 时,libopencv_java.so 存在。它也存在于 armeabi 中。
    • 我只是想澄清一下——我通过将整个库导入到我的工作区中来在我的工作区中使用 openCV。
    • 解决了!谢谢.. 我只是没有在我的应用程序中添加对 openCV 的引用。为此:在 Package Explorer 中右键单击您的应用程序,转到 Properties -> Android -> Library -> Add 并选择 OpenCV 库项目。
    【解决方案2】:

    使用 OpenCV 加载比使用 BitmapFactory 加载并转换为 OpenCV Mat 更快(20%-40%)

    Mat image = Highgui.imread("/sdcard/TVguide/Detection/detected.jpg");

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      相关资源
      最近更新 更多