【问题标题】:Face recognize using Opencv4Android SDK tutorial?人脸识别使用Opencv4Android SDK教程?
【发布时间】:2014-10-10 17:30:25
【问题描述】:

我是一名学生。最近我一直在使用 opencv 构建一个人脸识别项目,但我不知道从哪里开始。

通过阅读 opencv 人脸检测示例,我成功地使用 OpenCv4Android 构建了我的人脸检测。

现在我开始构建 人脸识别(使用 LBPH 算法)部分,我阅读了 Opencv 文档并在谷歌搜索我可以实际遵循的教程但我失败了(有很多使用 javacv 的教程,但我想改用 OpenCv4Android) :(

任何人都可以帮助我一步一步地指导我应该如何在 OpenCV4Android SDK 中使用人脸识别吗?非常感谢你。

补充:

  • 我在 opencv/contrib 中发现了 FaceRecognizer.java 类
  • 我在 OpenCV4android 文件夹中找到 facerec.java
  • 我在某处阅读并尝试了方法 FaceRecognize model = createLBPHFaceRecognizer() ---> 但方法 createLBPHFaceRecognizer() 未找到返回错误。我在哪里可以找到和使用这种方法?

请帮我下一步我需要做什么?非常感谢!!!!!!

【问题讨论】:

    标签: android opencv face-recognition


    【解决方案1】:

    在 java 包装器代码生成过程中跳过了 createFisherFaceRecognizer() 方法(以及其他 2 个 createXXXFaceRecognizer()),这是一个已知但尚未解决的问题。

    最好的解决方案是使用 jni/ndk 来实现它。您必须构建:

    • 带有本机 C++ 代码的 .so 文件,我们称之为 facerec.so 额外的 java 包装类调用,FisherFaceRecognizer.java

    遗憾的是,ndk 帮不上什么忙(这里没有这样的东西),但它在桌面/eclipse 上运行良好(dll/so 会直接进入您的项目文件夹),所以这里是代码(相当多的墙它)。

    // --- 8

    #include "jni.h"
    #include "opencv2/contrib/contrib.hpp"
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    JNIEXPORT jlong JNICALL Java_FisherFaceRecognizer_createFisherFaceRecognizer_10(JNIEnv* env, jclass);
    JNIEXPORT jlong JNICALL Java_FisherFaceRecognizer_createFisherFaceRecognizer_10(JNIEnv* env, jclass) {
        try {
            cv::Ptr<cv::FaceRecognizer> pfr = cv::createFisherFaceRecognizer();
            pfr.addref(); // this is for the 2.4 branch, 3.0 would need a different treatment here
            return (jlong) pfr.obj;
        } catch (...) {
            jclass je = env->FindClass("java/lang/Exception");
            env->ThrowNew(je, "sorry, dave..");
        }
        return 0;
    }
    
    JNIEXPORT jlong JNICALL Java_FisherFaceRecognizer_createFisherFaceRecognizer_11(JNIEnv* env, jclass, jint num_components);
    JNIEXPORT jlong JNICALL Java_FisherFaceRecognizer_createFisherFaceRecognizer_11(JNIEnv* env, jclass, jint num_components) {
        try {
            cv::Ptr<cv::FaceRecognizer> pfr = cv::createFisherFaceRecognizer(num_components);
            pfr.addref();
            return (jlong) pfr.obj;
        } catch (...) {
            jclass je = env->FindClass("java/lang/Exception");
            env->ThrowNew(je, "sorry, dave..");
        }
        return 0;
    }
    
    JNIEXPORT jlong JNICALL Java_FisherFaceRecognizer_createFisherFaceRecognizer_12(JNIEnv* env, jclass, jint num_components, jdouble threshold);
    JNIEXPORT jlong JNICALL Java_FisherFaceRecognizer_createFisherFaceRecognizer_12(JNIEnv* env, jclass, jint num_components, jdouble threshold) {
        try {
            cv::Ptr<cv::FaceRecognizer> pfr = cv::createFisherFaceRecognizer(num_components,threshold);
            pfr.addref();
            return (jlong) pfr.obj;
        } catch (...) {
            jclass je = env->FindClass("java/lang/Exception");
            env->ThrowNew(je, "sorry, dave..");
        }
        return 0;
    }
    
    #ifdef __cplusplus
    }
    #endif
    

    // --- 8

    import org.opencv.contrib.FaceRecognizer;
    import org.opencv.core.Core;
    
    public class FisherFaceRecognizer extends FaceRecognizer {
    
        static{ System.loadLibrary("facerec"); }
    
        private static native long createFisherFaceRecognizer_0();
        private static native long createFisherFaceRecognizer_1(int num_components);
        private static native long createFisherFaceRecognizer_2(int num_components, double threshold);
    
        public FisherFaceRecognizer () {
            super(createFisherFaceRecognizer_0());
        }
        public FisherFaceRecognizer (int num_components) {
            super(createFisherFaceRecognizer_1(num_components));
        }
        public FisherFaceRecognizer (int num_components, double threshold) {
            super(createFisherFaceRecognizer_2(num_components, threshold));
        }
    }
    

    一旦你编译了所有这些(恭喜!!),你可以这样称呼它:

    FaceRecognizer  facerec = new FisherFaceRecognizer();
       facerec.load("/sdcard/smile.yml"); // note, that it can't read from apk or zip, so you need to copy it somewhere
    
       Mat img = ...//test face
       int [] label = new int[1];
       double [] conf = new double[1];
       facerec.predict(img, label, conf);
    

    【讨论】:

    • 最好写下要做什么并将其发布为答案,而不是发布链接,因为链接可能会变得无效,然后您的答案就毫无用处了。您可以将链接作为评论发布。
    • 我们可以使用 JavaCPP 更轻松地完成这项工作。这是一个示例:github.com/bytedeco/javacv/blob/master/samples/…
    猜你喜欢
    • 2014-04-16
    • 2019-03-27
    • 2018-11-25
    • 2013-03-09
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2018-06-14
    相关资源
    最近更新 更多