我被困在认识脸上请帮助我,下面是我的代码
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);
}
用于检查目的我在不使用设备相机的情况下使用样本图像,我的问题是预测方法对所有样本给出相同的结果,请指导我在哪里做错了
答案 0 :(得分:2)
检查完代码后,我发现您收集标签的方式存在问题。在此labels[i] = i;
语句中,您为每个读取的图像设置了一个不同的标签。我想你每个人有多张图片。标签是分配给每个 PERSON 而不是每个 IMAGE 的数值(将其视为代码)。如果你有两个人,每人有3张图片,标签应该有[0,0,0,1,1,1]值。
您应该检查的另一个可能的问题是所有图像必须是 SAME 大小。这意味着您在循环中阅读的每个图像必须具有相同的大小 AND ,predict
中使用的图像必须具有相同的大小。一个好方法是通过定义固定大小,然后将您读取的每个图像调整为固定大小。
我能想到的最后一个问题是仅使用灰度图像。训练方法不使用彩色图像。与图像尺寸相同,只要您阅读图像,就将其转换为灰度。
此外,您可以查看Face Recognition on Android和Face recognition using OpenCV in android?