通过参考前面的post,用于分类的方法是欧几里德距离与最近邻。然而,获得的结果并不准确,因为已知数据集和未知数据集都给出99%的相似性。即使与马哈拉诺比斯距离也给出了类似的结果。
脸部识别分类还有其他方法吗?你能给我一些例子/公式吗?
float d_i = projectedTestFace[i] - projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i; // Euclidean distance
答案 0 :(得分:1)
没有任何进一步的预处理(对齐,裁剪,均衡),甚至像素上的普通L2范数也能提供比特征脸更好的结果。 (这里有可悲的事实)
从2.4.2开始,opencv有face-recognition out of-the-box。 (还有其他渔民和lbph特征)
你可能应该使用它,而不是自己滚动(请使用c ++ api,而不是奥术c)。
如果你想坚持使用特征脸,你仍然可以尝试“重建”(来自特征)图像和测试图像之间的L2距离作为置信度量,如done here(再由shervin,再次)
答案 1 :(得分:0)
// Compare two images by getting the L2 error (square-root of sum of squared error).
double getSimilarity(const Mat A, const Mat B)
{
if (A.rows > 0 && A.rows == B.rows && A.cols > 0 && A.cols == B.cols) {
// Calculate the L2 relative error between the 2 images.
double errorL2 = norm(A, B, CV_L2);
// Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
double similarity = errorL2 / (double)(A.rows * A.cols);
return similarity;
}
else {
//cout << "WARNING: Images have a different size in 'getSimilarity()'." << endl;
return 100000000.0; // Return a bad value
}
}
我想知道为什么我总会得到100000000.这是否意味着预处理和重建的脸有不同的大小?这就是为什么它会跳过L2距离比较?
以下是我编码的一部分:
Mat j =projectedTestFace[i];
Mat k =projectedTrainFaceMat>data.fl[iTrain*nEigens + i];
similarity=getSimilarity(j,k);
没有else语句,我得到相似性= -nan结果,想知道什么是-nan和-inf代表。