我正在使用Javacv 1.1。使用了约翰·列侬的图像来测试人脸识别,其中包含3个克里斯蒂亚诺·罗纳尔多和约翰·特里3个图像的数据库。只是为了验证我的程序在数据库中找不到john lennon,我使用了他的照片。
但是当节目预测谁是影像中的那个人时,告诉我克里斯蒂亚诺罗纳尔多是最相似的人。
我需要输入图像和大多数类似的训练图像之间的距离,以检查是否足够相似告诉我是谁,或者是否足够告诉那个人不知道。
另一个问题: 任何提示正确匹配的提示?
答案 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;
}