2012-03-13 43 views
0

我正在使用Java openCV,並嘗試加載照片並運行匹配的模板。 模板匹配方法處理Mat對象,所以我需要加載圖像並將它們轉換爲Mat。Java openCV - 將位圖映射到Mat的錯誤

我做到這一點的方法是:

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

這樣,我從加載我的Android的SD卡中的照片,並嘗試使用OpenCV的方法bitmapToMat將其轉換成墊目標。 問題是,在轉換時,應用程序崩潰。

這裏是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

回答

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"); 
+0

我已經嘗試了這兩個建議,但它仍然返回相同的logCat。也許是與該行有關:java.lang.UnsatisfiedLinkError:無法加載opencv_java:findLibrary返回null – Eyal 2012-03-13 16:45:02

+0

UnsatisfiedLinkError意味着你的。 apk不包括本機二進制文件。您可以解壓縮.apk並檢查是否存在'libopencv_java.so'。也有可能.apk只有ARMv7的二進制文件,而手機有ARMv5/ARMv6 CPU。 – 2012-03-13 16:56:24

+0

這款手機是三星Galaxy S,我相信它應該可以工作,因爲有些同學用openCV使用了同樣的手機。我不真正理解.apk是什麼意思,但是當我轉到C:\ Development \ OpenCV-2.3.1 \ libs \ armeabi-v7a時,libopencv_java.so存在。它也存在於armeabi中。 – Eyal 2012-03-13 16:59:54

0

裝載使用的OpenCV被更快(20%-40%)比使用BitmapFactory加載和轉化到OpenCV的墊

墊圖像= Highgui .imread( 「/ SD卡/電視週刊/檢測/ detected.jpg」);