gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:54 24 4
gpt4 key购买 nike

我正在尝试找到衡量两张面孔相似度的方法。我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com