【问题标题】:OpenCV Java createFisherFace PtrOpenCV Java createFisherFace Ptr
【发布时间】:2016-01-26 20:35:18
【问题描述】:

我一直在 Eclipse 上使用 OpenCV (Java) 进行开发。我现在需要为我的 FaceRecognizer 类创建一个 FisherFace。根据我的搜索,我发现似乎没有任何支持。根据this question,它似乎与 Ptr 类有关。是不是 Java 没有 Ptr 类来处理返回的 Ptr 值?如果是这样,那么this Java Ptr class 会处理它吗?如果这不是解决方案,是否有任何教程可以指导我制作 FaceRecognizer 类?谢谢!

【问题讨论】:

  • 能否请您发布一个包含所有 JNI 注入的 facerec.cpp 的完整代码?

标签: java opencv pointers


【解决方案1】:

整个问题都在 c++ 方面,所以你的 java Ptr 类将无济于事。

使用 opencv 2.4.8,您可以尝试重建 jni-adapter:

(注意,opencv3.0 中的 cv::Ptr 类不兼容)


// facerec.dll
#include "jni.h"
#include "opencv2/contrib/contrib.hpp"


extern "C" {


JNIEXPORT jlong JNICALL Java_org_matxx_n_createLBPHFaceRecognizer(JNIEnv* env, jclass, jint);

JNIEXPORT jlong JNICALL Java_org_matxx_n_createLBPHFaceRecognizer(JNIEnv* env, jclass, jint)
{
    try {

        cv::Ptr<cv::FaceRecognizer> ptr = cv::createLBPHFaceRecognizer();
        cv::FaceRecognizer * pf = ptr.get();
        ptr.addref(); //don't let it self-destroy here..
        return (jlong) pf;
    } catch (...) {
        jclass je = env->FindClass("java/lang/Exception");
        env->ThrowNew(je, "sorry, dave..");
    }
    return 0;
}
} // extern "C"

还有一个java“工厂”:


// LBPHFaceRecognizer.java

import org.opencv.contrib.FaceRecognizer;
import org.opencv.core.Core;


public class LBPHFaceRecognizer extends FaceRecognizer
{
    static{ System.loadLibrary("facerec.dll"); }

    private static native long n_createLBPHFaceRecognizer();

    public LBPHFaceRecognizer()
    {
        super(n_createLBPHFaceRecognizer());
    }
}

稍后,您可以创建人脸识别:


FaceRecognizer facerec = new LBPHFaceRecognizer();

【讨论】:

  • 谢谢!我该怎么做才能完成这项工作?我知道第二批代码用于在我的 Java 项目中创建一个类,对吗?我可以从您的第三行代码中访问它。但是第一行是什么,我该如何使用它?是否制作“facerec.dll”并将其复制到我的Java项目文件夹中?最后一个问题,FisherFace 或 Eigenface 呢?感谢您的反馈意见!真的很有帮助!
  • 1. - 您必须使用 jni 和 c++ 编译器(以及 ofc。opencv 库)从第一部分构建 dll/so 2. - 只需将 LBPH 替换为 Fisher 或 Eigen
  • 谢谢,最后一个问题,这在Linux和Mac下可以工作吗?我希望它至少可以在 Linux 下工作。谢谢!
  • 你必须为每个操作系统重建 dll/so
  • facerec = new LBPHFaceRecognizer(8,8); Mat m = Mat.eye(32,32,0); Mat z = Mat.zeros(32,32,0); List&lt;Mat&gt; src = new ArrayList&lt;Mat&gt;(); src.add(z); src.add(z); src.add(m); Mat labels = new Mat(1,3, CvType.CV_32S); int [] l = {1,2,3}; labels.put(0, 0, l); facerec.train(src, labels); int [] label = new int[1]; double [] conf = new double[1]; facerec.predict(m, label, conf); System.out.println("rec " + label[0] + " " + conf[0]); // rec 3 0.0
猜你喜欢
  • 2018-10-23
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
相关资源
最近更新 更多