Android OpenCv Face识别

时间:2018-04-05 09:47:20

标签: opencv face-recognition

我被困在认识脸上请帮助我,下面是我的代码

FaceRecognizer faceRecognizer = com.googlecode.javacv.cpp.opencv_contrib.createFisherFaceRecognizer();

我的训练方法

 public void train(){

        IplImage img;
        IplImage grayImg;

        if(nameList!=null && nameList.size()>0){
            for (int i = 0; i < nameList.size(); i++) {
                String p = mPath+"person0/"+i+".png";
                img = cvLoadImage(p);
                labels[i] = i;
                grayImg = IplImage.create(img.width(), img.height(), IPL_DEPTH_8U, 1);
                cvCvtColor(img, grayImg, CV_BGR2GRAY);
                images.put(i, grayImg);
            }
        }
        faceRecognizer.train(images,labels);
    }

我的预测方法

public void predict(){
        String testPath = mPath+"test/person1.png";

        Mat img = imread(testPath);
        IplImage ipl = MatToIplImage(img,img.width(), img.width());
  int predicted = faceRecognizer.predict(ipl);
        Log.v(TAG," predicted : "+predicted);
    }

用于检查目的我在不使用设备相机的情况下使用样本图像,我的问题是预测方法对所有样本给出相同的结果,请指导我在哪里做错了

1 个答案:

答案 0 :(得分:2)

检查完代码后,我发现您收集标签的方式存在问题。在此labels[i] = i;语句中,您为每个读取的图像设置了一个不同的标签。我想你每个人有多张图片。标签是分配给每个 PERSON 而不是每个 IMAGE 的数值(将其视为代码)。如果你有两个人,每人有3张图片,标签应该有[0,0,0,1,1,1]值。

您应该检查的另一个可能的问题是所有图像必须 SAME 大小。这意味着您在循环中阅读的每个图像必须具有相同的大小 AND predict中使用的图像必须具有相同的大小。一个好方法是通过定义固定大小,然后将您读取的每个图像调整为固定大小。

我能想到的最后一个问题是仅使用灰度图像。训练方法不使用彩色图像。与图像尺寸相同,只要您阅读图像,就将其转换为灰度。

此外,您可以查看Face Recognition on AndroidFace recognition using OpenCV in android?