Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OpenIMAJ识别新面_Java_Face Recognition_Openimaj - Fatal编程技术网

Java 如何使用OpenIMAJ识别新面

Java 如何使用OpenIMAJ识别新面,java,face-recognition,openimaj,Java,Face Recognition,Openimaj,在我的Java应用程序中,我有一个来自不同线程的JPG实时图像流,我想不断扫描人脸,以便稍后输出一个列表,其中列出了在相机运行时经过相机的所有不同人脸,以及每个人脸被看到的次数。以下是我当前的代码: void doImageProcessing() { // Create face stuff FKEFaceDetector faceDetector = new FKEFaceDetector(new HaarCascadeDetector()); EigenFaceR

在我的Java应用程序中,我有一个来自不同线程的JPG实时图像流,我想不断扫描人脸,以便稍后输出一个列表,其中列出了在相机运行时经过相机的所有不同人脸,以及每个人脸被看到的次数。以下是我当前的代码:

void doImageProcessing() {

    // Create face stuff
    FKEFaceDetector faceDetector = new FKEFaceDetector(new HaarCascadeDetector());
    EigenFaceRecogniser<KEDetectedFace, Person> faceRecognizer = EigenFaceRecogniser.create(512, new RotateScaleAligner(), 512, DoubleFVComparison.CORRELATION, Float.MAX_VALUE);
    FaceRecognitionEngine<KEDetectedFace, Extractor<KEDetectedFace>, Person> faceEngine = FaceRecognitionEngine.create(faceDetector, faceRecognizer);

    // Start loop
    while (true) {

        // Get next frame
        byte[] imgData = nextProcessingData;
        nextProcessingData = null;

        // Decode image
        BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgData));

        // Detect faces
        FImage fimg = ImageUtilities.createFImage(img);
        List<KEDetectedFace> faces = faceEngine.getDetector().detectFaces(fimg);

        // Go through detected faces
        for (KEDetectedFace face : faces) {

            // Find existing person for this face
            Person person = null;
            try {

                List<IndependentPair<KEDetectedFace, ScoredAnnotation<Person>>> rfaces = faceEngine.recogniseBest(face.getFacePatch());
                ScoredAnnotation<Person> score = rfaces.get(0).getSecondObject();
                if (score != null)
                    person = score.annotation;

            } catch (Exception e) {
            }

            // If not found, create
            if (person == null) {

                // Create person
                person = new Person();
                System.out.println("Identified new person: " + person.getIdentifier());

                // Train engine to recognize this new person
                faceEngine.train(person, face.getFacePatch());

            } else {

                // This person has been detected before
                System.out.println("Identified existing person: " + person.getIdentifier());

            }

        }

    }

}
void doImageProcessing(){
//创造面子
FKEFaceDetector faceDetector=新的FKEFaceDetector(新的HaarCascadeDetector());
EigenFaceRecognitor FaceRecognitor=EigenFaceRecognitor.create(512,新的RotateScaleAlligner(),512,DoubleFVComparison.CORRELATION,Float.MAX_值);
FaceRecognitionEngine faceEngine=FaceRecognitionEngine.create(faceDetector,FaceRecognitor);
//起动回路
while(true){
//下一帧
字节[]imgData=nextProcessingData;
nextProcessingData=null;
//解码图像
buffereImage img=ImageIO.read(新的ByteArrayInputStream(imgData));
//检测人脸
FImage fimg=ImageUtilities.createFImage(img);
List faces=faceEngine.getDetector().detectFaces(fimg);
//检查检测到的人脸
用于(检测到的面:面){
//查找此面的现有人员
Person=null;
试一试{
List rfaces=faceEngine.recognizebest(face.getFacePatch());
ScoredAnotation score=rfaces.get(0.getSecondObject();
如果(分数!=null)
person=score.annotation;
}捕获(例外e){
}
//如果找不到,请创建
if(person==null){
//创造人
person=新的person();
System.out.println(“已识别的新人:+person.getIdentifier());
//训练引擎来识别这个新人
faceEngine.train(person,face.getFacePatch());
}否则{
//这个人以前被发现过
System.out.println(“已识别的现有人员:+person.getIdentifier());
}
}
}
}
问题是它总是将一张脸检测为新的,即使它是在前一帧中检测到的同一张脸<代码>面始终为空。它永远无法识别现有的人脸。我做错了什么


另外,我不知道creator函数的参数应该是什么,也许这就是它无法识别任何东西的原因…

您提供给
EigenFaceRecogniser.create()
函数的参数太离谱了,所以这可能是您出现问题的原因。以下方法更有可能奏效:

EigenFaceRecogniser<KEDetectedFace, Person> faceRecognizer = EigenFaceRecogniser.create(20, new RotateScaleAligner(), 1, DoubleFVComparison.CORRELATION, 0.9f);
通常最好让OpenIMAJ读取您的图像,因为它解决了ImageIO处理某些类型JPEG的一些已知问题:

    FImage fimg = ImageUtilities.readF(new ByteArrayInputStream(imgData));

您提供给
EigenFaceRecogniser.create()
函数的参数太离谱了,因此这可能是您出现问题的原因。以下方法更有可能奏效:

EigenFaceRecogniser<KEDetectedFace, Person> faceRecognizer = EigenFaceRecogniser.create(20, new RotateScaleAligner(), 1, DoubleFVComparison.CORRELATION, 0.9f);
通常最好让OpenIMAJ读取您的图像,因为它解决了ImageIO处理某些类型JPEG的一些已知问题:

    FImage fimg = ImageUtilities.readF(new ByteArrayInputStream(imgData));