opencv - 如何在 OpenCV 中获得最相似的 Eigenfaces 或 Fisherfaces?

标签 opencv similarity face-recognition

我正在尝试寻找两张脸相似度的测量方法。我使用 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);
    }

问题:

  1. 谁能告诉我如何重写它以输出前 10 个面孔,而不仅仅是前 1 个?我正在考虑将它们插入优先级队列,但也许有更简单的方法?!

  2. 在训练中:我应该把所有的人脸放在同一个标​​签上还是不同的标签上?那么我应该有 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/

相关文章:

python - 使用 Python、OpenCV 和卡尔曼滤波进行二维运动估计

java - 基于字典的字符串匹配算法 - Java

algorithm - 如何像 Excel 一样发现和分析相似的模式?

hadoop - hadoop 中的交叉积和阅读标题

opencv - FaceRec教程讲解

opencv - 光流运动结构

c++ - 未知类型名称命名空间

c# - OpenCV 从字节数组创建 Mat

android - 人脸识别使用Opencv4Android SDK教程?

java - 如何使用opencv计算人脸识别的百分比格式预测置信度?