2015-05-31 20 views
0

我试图用javaCV实现一个简单的人脸识别代码。我收到一个错误,不知道为什么。在JavaCV中加载库中的错误Android中的

我每天.so文件复制到几乎所有的目录 - >应用程序/库/ armeabi和app/src目录/主/ jniLibs 还复制javacpp.jar和javacv.jar到应用程序/ libs目录

这里的错误:

Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libopencv_contrib.so" needed by "libjniopencv_contrib.so"; caused by could not load library "../../lib/libopencv_legacy.so" needed by "libopencv_contrib.so"; caused by library "../../lib/libopencv_legacy.so" not found at java.lang.Runtime.load(Runtime.java:330) at java.lang.System.load(System.java:511) at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:700) at com.googlecode.javacpp.Loader.load(Loader.java:586) at com.googlecode.javacpp.Loader.load(Loader.java:540) at com.googlecode.javacv.cpp.opencv_contrib.(opencv_contrib.java:97) at com.ifta.face.OpenCVFaceRecognizer.recognise(OpenCVFaceRecognizer.java:102) at com.ifta.face.FinalActivity.testPreviousImage(FinalActivity.java:126) at com.ifta.face.FinalActivity.onTestClicked(FinalActivity.java:50) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at android.view.View$1.onClick(View.java:3809) at android.view.View.performClick(View.java:4421) at android.view.View$PerformClick.run(View.java:17903) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:213) at android.app.ActivityThread.main(ActivityThread.java:5225) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) at dalvik.system.NativeStart.main(Native Method)

我使用的Java函数是:

public static void recognise(Context context, File sampleDir, File testFile) { 

    // DEBUG-1 
    if(sampleDir!=null) 
     log(context, "1. sampleDir OK. " + testFile.getAbsolutePath()); 
    else { 
     log(context, "1. sampleDir is Null"); 
     return; 
    } 


    FilenameFilter pngFilter = new FilenameFilter() { 
     public boolean accept(File dir, String name) { 
      return name.toLowerCase().endsWith(".png"); 
     } 
    }; 

    File[] imageFiles = sampleDir.listFiles(pngFilter); 

    // DEBUG-2 
    if(imageFiles!=null) { 
     log(context, "2. ImageFile OK, Files :"); 
     for(File imageFile : imageFiles) 
      log(context, "File : " + imageFile.getAbsolutePath()); 
    } 
    else { 
     log(context, "2. ImageFile Array Null"); 
     return; 
    } 

    // DEBUG-.5 
    if(testFile!=null) 
     log(context, "2.5. testFile OK. " + testFile.getAbsolutePath()); 
    else { 
     log(context, "2.5. testFile is Null"); 
     return; 
    } 

    IplImage testImage = cvLoadImage(testFile.getAbsolutePath()); 
    // DEBUG-3 
    if(imageFiles!=null) 
     log(context, "3. testImageIpl OK"); 
    else { 
     log(context, "3. testImageIpl is Null"); 
     return; 
    } 

    MatVector images = new MatVector(imageFiles.length); 

    int[] labels = new int[imageFiles.length]; 

    int counter = 0; 
    int label; 

    IplImage img; 
    IplImage grayImg; 

    for (File image : imageFiles) { 
     // Get image and label: 
     img = cvLoadImage(image.getAbsolutePath()); 
     label = Integer.parseInt(image.getName().split("\\-")[0]); 

     // Convert image to gray scale: 
     grayImg = IplImage.create(img.width(), img.height(), IPL_DEPTH_8U, 1); 
     cvCvtColor(img, grayImg, CV_BGR2GRAY); 
     // Append it in the image list: 
     images.put(counter, grayImg); 
     // And in the labels list: 
     labels[counter] = label; 
     // Increase counter for next image: 
     counter++; 
    } 

    //FaceRecognizer faceRecognizer = createFisherFaceRecognizer(); 
    FaceRecognizer faceRecognizer = createEigenFaceRecognizer(); 
    // FaceRecognizer faceRecognizer = createLBPHFaceRecognizer(); 

    faceRecognizer.train(images, labels); 

    // Load the test image: 
    IplImage greyTestImage = IplImage.create(testImage.width(), testImage.height(), IPL_DEPTH_8U, 1); 
    cvCvtColor(testImage, greyTestImage, CV_BGR2GRAY); 

    // And get a prediction: 
    //int predictedLabel = faceRecognizer.predict(greyTestImage); 
    //System.out.println("Predicted label: " + predictedLabel); 

    int[] imageLabels = new int[1]; 
    double[] confidences = new double[1]; 

    faceRecognizer.predict(greyTestImage, imageLabels, confidences); 

    log(context, "Result : Label - " + imageLabels[0] + " Conf - " + confidences[0]); 


} 

回答

0

我解决了这个后2天...我想手动加载库。我加了几行

System.load("/data/data/com.ifta.face/lib/libopencv_photo.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_flann.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_features2d.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_calib3d.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_ml.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_video.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_legacy.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_objdetect.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_gpu.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_nonfree.so"); 
    System.load("/data/data/com.ifta.face/lib/libopencv_contrib.so"); 

还有一件事我发现有名字库“libjni * .so”装会自动加载和像“libopencv _ *。所以”必须手动加载。加载顺序也必须如上所述,因为库依赖于前者。任何人都知道这是为什么发生?

+0

你能告诉我应该放入哪些jar文件:app/libs/armeabi,app/src/main/jniLibs,app/libs。我正在使用javacv 1.2。 – user1850484