Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenCV中获得最相似的特征面或鱼面?_Opencv_Similarity_Face Recognition - Fatal编程技术网

如何在OpenCV中获得最相似的特征面或鱼面?

如何在OpenCV中获得最相似的特征面或鱼面?,opencv,similarity,face-recognition,Opencv,Similarity,Face Recognition,我试图找到两张脸相似性的度量。我使用OpenCV。为此,我用1000张不同人物的1000张照片(每个人1张照片)来训练特征脸/鱼脸。所以我在训练集中也有1000个标签 现在我可以使用预测方法得到最相似的脸 我想输入两张未知的人脸图像,看看它们是否与训练集中的同一个人脸向量相似 以下是openCV的代码,它返回最相似的标签(距离最小) for(size\t sampleIdx=0;sampleIdx

我试图找到两张脸相似性的度量。我使用OpenCV。为此,我用1000张不同人物的1000张照片(每个人1张照片)来训练特征脸/鱼脸。所以我在训练集中也有1000个标签

现在我可以使用预测方法得到最相似的脸

我想输入两张未知的人脸图像,看看它们是否与训练集中的同一个人脸向量相似

以下是openCV的代码,它返回最相似的标签(距离最小)

for(size\t sampleIdx=0;sampleIdx<\u projections.size();sampleIdx++){
双距离=范数(_投影[sampleIdx],q,范数_L2);
如果((距离
问题:

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

  • 在培训中:我应该把所有的脸贴在同一个标签上还是贴在不同的标签上?那么我应该贴1个标签还是1000个标签


  • Cheers

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

    virtual void predict(InputArray src, int &label, double &confidence,  Vector <variable>) const = 0;
    
    virtualvoid predict(输入数组src、int和label、双精度和置信度、向量)const=0;
    
    下面是我做的。注意我在Perl上很好,C++中的NeWB(实际上这是我的第一个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);
        }
    }
    
    for(size\t sampleIdx=0;sampleIdx<\u projections.size();sampleIdx++){
    双距离=范数(_投影[sampleIdx],q,范数_L2);
    int labelClass=_labels.at((int)sampleIdx);
    
    cout::Q2:不同的主题/人有不同的标签。因此,1000个标签是正确的。
    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);
        }
    }
    
    #include <iostream>
    
    using namespace std;