Java openCV - 将位图转换为Mat的错误

时间:2012-03-13 13:26:18

标签: java android opencv bitmap

我正在使用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。

由于 的Eyal

2 个答案:

答案 0 :(得分:3)

您需要将位图转换为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");

答案 1 :(得分:0)

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

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