如何在Javacv中获得面部平等范围

时间:2016-02-19 00:07:56

标签: java opencv javacv

我正在使用Javacv 1.1。使用了约翰·列侬的图像来测试人脸识别,其中包含3个克里斯蒂亚诺·罗纳尔多和约翰·特里3个图像的数据库。只是为了验证我的程序在数据库中找不到john lennon,我使用了他的照片。

但是当节目预测谁是影像中的那个人时,告诉我克里斯蒂亚诺罗纳尔多是最相似的人。

我需要输入图像和大多数类似的训练图像之间的距离,以检查是否足够相似告诉我是谁,或者是否足够告诉那个人不知道。

另一个问题: 任何提示正确匹配的提示?

1 个答案:

答案 0 :(得分:0)

这是我的解决方案(仅针对Android平台测试),假设您使用特征脸:

public boolean verifyPerson (Mat matResized) {
        CvArr eigenvectors = faceRecognizer.getMat("eigenvectors");
        CvArr averageFaceRow = faceRecognizer.getMat("mean");
        IplImage img1D =MatToIplImage(matResized.reshape(1,1),-1, -1);
        // Project the input image onto the eigenspace:
        CvMat projection = subspaceProject(eigenvectors, averageFaceRow, img1D);
        // Generate the reconstructed face back from the eigenspace:
        CvMat reconstructionRow = subspaceReconstruct(eigenvectors, averageFaceRow, projection);
        CvMat reconstructionMat = new CvMat();
        cvReshape(reconstructionRow, reconstructionMat, 1, matResized.height()); 
        Mat reconstructedFace = CvMatToMat(reconstructionMat);
        // Calculate the L2 relative error between the 2 images.
        double errorL2 = Core.norm(matResized, reconstructedFace, CV_L2);
        // Scale the value since L2 is summed across all pixels.
        double uncertainty = errorL2 / (double)(matResized.rows() * matResized.cols());
        boolean verified;
        if (uncertainty < MaxPersonUncertainty) {
            verified = true; 
            }else{
            verified = false; // Unknown person.
            }
        return verified;
    }