2013-04-14 69 views
1

這個問題現在讓我瘋狂了好幾天。我正在嘗試使用opencv android最新的軟件包。一切都插入,我沒有任何錯誤,直到我在Android上運行項目,這是它崩潰時。當我調用一個簡單的代碼時,Mat m = new Mat();該應用程序崩潰,我看到一些其他人有同樣的問題,但不知何故,他們設法解決它,這裏是我的代碼,也許這是愚蠢的,我看不到!我真正需要的是矩陣庫,我試過賈馬和傑布拉斯,但他們工作到某一點,但他們也崩潰了,他們非常緩慢。Open2.4.5 Android當我打電話時崩潰Mat

package com.ece.facerecog; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream;' 
import java.util.Arrays; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
    import org.opencv.core.Mat; 

import com.ece.facerecog.utils.UIHelper; 


//import org.jblas.DoubleMatrix; 


    //import Jama.Matrix; 
    import android.app.Activity; 
import android.content.Context; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
import android.graphics.Color; 
//import android.graphics.Matrix; 

    import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.widget.GridView; 
import android.widget.ImageView; 
    import android.widget.TextView; 

    public class Face extends Activity { 
private Bitmap bitmap; 
private int f = Crop.k; 
private ImageView tv; 

    private static final String TAG     = "OCVSample::Activity"; 

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
      { 
       Log.i(TAG, "OpenCV loaded successfully"); 

      } break; 
      default: 
      { 
       super.onManagerConnected(status); 
      } break; 
     } 
    } 
}; 
    // @Override 
    // public void onResume() 
    // { 
    //  super.onResume(); 
    //  OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this,       k     mLoaderCallback); 
    // } 

private Bitmap ReadImage1(String fBitmap) { 
    String root = Environment.getExternalStorageDirectory().toString(); 
    File myDir = new File(root + "/preprocessed"); 
    File file = new File(myDir , fBitmap); //or any other format supported 
    UIHelper.displayText(this, R.id.textView1, file.toString()); 

    try { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888;   
     Bitmap bitmap =   `BitmapFactory.decodeFile(file.getAbsolutePath(),options); //This gets the image `  
     return bitmap; 

     } catch (Exception e) { 
       e.printStackTrace(); 
       UIHelper.displayText(this, R.id.textView1, "Doesn't exist"); 
     } 

     return bitmap; 
    } 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.face); 

Log.i(TAG, "Trying to load OpenCV library"); 
if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this, mLoaderCallback)) 
{ 
    Log.e(TAG, "Cannot connect to OpenCV Manager"); 
} 


ImageView tv = (ImageView) findViewById(R.id.imageView1); 
Bitmap bmp = ReadImage1("/Image-" + f+ ".jpg"); 
tv.setImageBitmap(bmp); 
Mat m = new Mat(); 

}}

`

這裏的日誌錯誤,

04-13 23:14:17.412: E/AndroidRuntime(12111): FATAL EXCEPTION: main 
04-13 23:14:17.412: E/AndroidRuntime(12111): java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.core.Mat.n_Mat:()J 
04-13 23:14:17.412: E/AndroidRuntime(12111): at org.opencv.core.Mat.n_Mat(Native Method) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at org.opencv.core.Mat.<init>(Mat.java:441) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at com.ece.facerecog.Face.onCreate(Face.java:147) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.Activity.performCreate(Activity.java:5104) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.os.Looper.loop(Looper.java:137) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at android.app.ActivityThread.main(ActivityThread.java:5039) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at java.lang.reflect.Method.invokeNative(Native Method) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at java.lang.reflect.Method.invoke(Method.java:511) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-13 23:14:17.412: E/AndroidRuntime(12111): at dalvik.system.NativeStart.main(Native Method) 

謝謝你幫我出去!

回答

5

OpenCV的功能,如Mat必須調用threadAsyncTask,我想。沒有幫助,我面臨AGES的同樣問題。

爲了避免崩潰,您可以聲明Mat m作爲全局變量,並在OpenCV的AsyncInitialization塊中初始化它。

事情是這樣的:

public class Face extends Activity { 
private Bitmap bitmap; 
private int f = Crop.k; 
private ImageView tv; 
Mat m; 
private static final String TAG     = "OCVSample::Activity"; 

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
@Override 
public void onManagerConnected(int status) { 
    switch (status) { 
     case LoaderCallbackInterface.SUCCESS: 
     { 
      Log.i(TAG, "OpenCV loaded successfully"); 
      m=new Mat(); 
     } break; 
     default: 
     { 
      super.onManagerConnected(status); 
     } break; 
    } 
} 
}; 

如果它仍然崩潰,我會建議你執行你在AsyncTask在我project試圖像什麼功能。但是,可以聲明Mat函數,而不會有OpenCV函數中的UnsatisfiedLinkError異常的風險。然而,在UI中調用的函數會遇到這種情況至少這是我見過的。

+0

我不知道爲什麼你得到了一個投票!但是你是對的,如果我在Async中這樣做,它不會崩潰。那謝謝啦! –

+0

不客氣!你可以投票答案嗎?我已經投了這個問題了。 –

+0

我還沒有足夠的聲譽,我會在獲得「15聲望」的時候! –

4

我剛剛遇到同樣的問題,發現了另一個解決方案:
您可以使用其他活動來調用您的活動(「面部」),就像使用啓動活動的按鈕的某個介紹屏幕一樣。如果您在此介紹活動中初始化OpenCV(與您在活動中做的方式相同),則可以在下次活動中使用OpenCV函數,而不會有任何問題...

這樣您就不必將OpenCV變量聲明爲全局變量並在OpenCV的AsyncInitialization塊中初始化它們。

相關問題