我正在尝试寻找两张脸相似度的测量方法。我使用 OpenCV。为此,我用 1000 个不同人的 1000 张照片来训练 Eigenfaces/Fisherfaces(所以每个人 1 张照片)。所以我的训练集中还有 1000 个标签。
现在我可以使用预测方法来获得最相似的人脸。
我想输入 2 张未知的人脸图像,看看它们是否与训练集中的同一个人脸向量相似。
这是返回最相似标签(距离最小)的openCV代码。
for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
double dist = norm(_projections[sampleIdx], q, NORM_L2);
if((dist < minDist) && (dist < _threshold)) {
minDist = dist;
minClass = _labels.at<int>((int)sampleIdx);
}
问题:
谁能告诉我如何重写它以输出前 10 个面孔,而不仅仅是前 1 个?我正在考虑将它们插入优先级队列,但也许有更简单的方法?!
在训练中:我应该把所有的人脸放在同一个标签上还是不同的标签上?那么我应该有 1 个标签还是 1000 个标签?
干杯
最佳答案
这就是我所做的。注意,我真的很擅长 Perl,在 C++ 方面确实是新手(事实上,这是我的第一个 C++ 项目!),所以我向命令行输出了很多内容,并使用 Perl 对其进行了解析。
我像你一样去了facerec.cpp,并将for循环的内容更改为:
for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
double dist = norm(_projections[sampleIdx], q, NORM_L2);
int labelClass = _labels.at<int>((int)sampleIdx);
cout << dist << " " << labelClass << endl;
if((dist < minDist) && (dist < _threshold)) {
minDist = dist;
minClass = _labels.at<int>((int)sampleIdx);
}
}
现在输出每个面的距离和标签。由于所有预测函数似乎所做的就是拍摄距离最短(最小数字)的图片并将其作为答案返回,因此您现在可以获取结果列表,对其进行排序,然后获取前 10 个结果。或者你可以拿前十个标签或其他什么。这只是让您可以访问所有数据,而不是前 X 个结果。
我还添加了
#include <iostream>
using namespace std;
到文件顶部,以便我可以使用 cout。
关于opencv - 如何在 OpenCV 中获得最相似的 Eigenfaces 或 Fisherfaces?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14451188/