OpenCV + Android - 面部识别不起作用

时间:2015-09-05 02:14:52

标签: android opencv android-ndk

我已将此项目:https://github.com/yaylas/AndroidFaceRecognizer实施到Android Studio中。我使用教程包括OpenCV:https://www.youtube.com/watch?v=OTw_GIQNbD8(这是静态初始化)。而且,我在Android Studio中设置了适当的NDK位置。 问题是,如果我添加这个类:

package com.yaylas.sytech.facerecognizer;

import java.util.Vector;

import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;

import android.widget.Toast;

public class DetectionBasedTracker
{
    public DetectionBasedTracker(String cascadeName, int minFaceSize, boolean isFaceDetector) {
        mNativeObj = nativeCreateObject(cascadeName, minFaceSize, isFaceDetector);
    }

    public long getNativeObj(){
        return mNativeObj;
    }

    public void setMinFaceSize(int size) {
        nativeSetFaceSize(mNativeObj, size);
    }

    public void detect(Mat imageGray, MatOfRect faces) {
        nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());
    }

    public void release() {
        nativeDestroyObject(mNativeObj);
        mNativeObj = 0;
    }
    public static Vector<Mat> imageVector = new Vector<Mat>();
    public static void addElement(Mat m){
        imageVector.add(m);
        System.out.println("--------------------------------- elementAdded: "+imageVector.size());
    }

    public static long getElementAt(int index){
        if(index >= imageVector.size() || index < 0){
            return 0;
        }

        System.out.println("-------------------------***** get element: "+imageVector.size()+"  index: "+index);
        return imageVector.elementAt(index).getNativeObjAddr();
    }

    public static int getImageCount(){
        return imageVector.size();
    }


    private long mNativeObj = 0;

    private static native long nativeCreateObject(String cascadeName, int minFaceSize, boolean faceDetection);
    private static native void nativeDestroyObject(long thiz);
    private static native void nativeStart(long thiz);
    private static native void nativeStop(long thiz);
    private static native void nativeSetFaceSize(long thiz, int size);
    private static native void nativeDetect(long thiz, long inputImage, long faces);

}

返回错误:

  

无法解析相应的JNI功能

我尝试了一切,但错误仍然存​​在。我想问一下,哪里可能有问题?

1 个答案:

答案 0 :(得分:0)

运行时可能无法解析JNI函数的原因有多种。测试这些假设:

  • 本地代码库未捆绑到您的APK中。在里面查看APK。
  • 本机代码库位于APK的错误目录中。再看,看看。
  • Java类被ProGuard破坏,因此名称不再与本机库匹配。尝试关闭ProGuard。调试版本应该关闭。
  • 如果您的本机代码库是为ARM编译的,但是您在基于x86的Android模拟器中运行(反之亦然),则无法加载该库。
  • 考虑更多假设,然后测试它们。

页面http://opencv.org/platforms/android.html在Android上有很多关于OpenCV的信息,包括指向教程的链接。