如何在OpenCV中获得最相似的特征脸或Fisherfaces?

时间:2013-01-22 03:37:28

标签: opencv similarity face-recognition

我正在尝试找到2张脸的相似度。我使用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个?

  3. 干杯

2 个答案:

答案 0 :(得分:1)

这就是我的所作所为。注意我非常擅长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。

答案 1 :(得分:0)

Q1 ::由于OpenCV不提供默认功能,您必须通过创建具有距离和标签的矢量来创建自己的功能。您可以按如下所示编写自己的函数,并将距离和标签存储在矢量中。在这里,您需要重建opencv。

virtual void predict(InputArray src, int &label, double &confidence,  Vector <variable>) const = 0;