使用 opencv 和 node 比较两个人脸的相似度

Posted

技术标签:

【中文标题】使用 opencv 和 node 比较两个人脸的相似度【英文标题】:use opencv and node to compare 2 faces for similarity 【发布时间】:2014-03-06 00:50:30 【问题描述】:

我正在运行 openCV 和 nodejs,我的目标是制作一个程序,当它看到一张脸时拍摄一张照片(已经这样做了),然后将这张脸与不同的脸进行比较,以查看它是否是一场比赛。我会知道谁的脸是数据库中的谁,所以基本上我会知道网站拍了谁的脸。我得到了下面的代码来拍照并保存它......但我不确定如何获得测量值或与另一张脸进行比较。我找到了图像比较的示例,但我想我需要面部比较。

 var snap = function()

vid.read(函数(错误,我) im.detectObject(cv.FACE_CASCADE, , function(err, faces)

    console.log("FACES", faces)
  if (faces.length == 0)
    console.log("No Faces")
    return false;
  
  var face = faces[0]
    , ims = im.size()

  var im2 = im.roi(face.x, face.y, face.width, face.height)
  /*
  im.adjustROI(
       -face.y
     , (face.y + face.height) - ims[0]
     , -face.x
     , (face.x + face.width) - ims[1])
     */
  im2.save('out.jpg')
)

); 快照()

谢谢

【问题讨论】:

你的意思是你需要人脸识别吗?您可以尝试 gabor 过滤器或 LBP 您似乎不知道自己在做什么。您的案例将是“面部验证”,这是有史以来最艰巨的任务之一...... 【参考方案1】:

我相信您使用的是 node-opencv 库?您将需要更多步骤。您必须训练您的 opencv 系统,然后才能使用 FaceRecongizer() 中的“predictSync”方法。

node-opencv 库有一个你首先初始化的 FaceRecognizer 对象。

    初始化人脸识别器: var FaceRecognizer = new cv.FaceRecognizer();

    您必须阅读所有图像,创建一个特定数组并用它训练您的 FaceRecognizer。出于我的目的,我将每个用户保存在数据库中,他们会获得一个唯一的 ID,我用它来创建一个特定的子文件夹,稍后会使用它。 这是我的代码:

    //Cold start training for opencv
    var uploadDir = path.join(global.appRoot, "/uploads");
    fs.readdir(uploadDir, function(err, files)
    if(err) throw new Error(err);
    if(files.length > 0) //There are some user related image folders
        files.forEach(function(subfolder, index, array)
            if(subfolder != ".DS_Store" ) //Issue with Mac, test on Linux-VM
                //We are now iterating over each subfolder
                var subFolderDir = path.join(uploadDir, "/"+subfolder);
                var images = fs.readdirSync(subFolderDir);
                //console.log(images);
                images.forEach(function(image, index, array)//Get Matrix Objekt for each image to train OpenCV
                    if(image != ".DS_Store")
                        var imageDir = path.join(subFolderDir, "/"+image);
                        cv.readImage(imageDir, function(err, im)
                            var channels = im.channels();
                            if(channels >=3)
                                var labelNumber = parseInt(subfolder); //Create labelnumber; Account-Id starts by 1, labels for openCV start with 0
                                cvImages.push(new Array(labelNumber,im));  //Add image to Array 
                                                  
                        );
                    
                );
            
        );
        if(cvImages.length > 3)
            console.log("Training images (we have at least 3 images)", cvImages);
            FaceRecognizer.trainSync(cvImages);
        else
            console.log("Not enough images uploaded yet", cvImages);
        
    else
        console.log("There are no images uploaded yet!");
    
    );`  
    

我敢肯定,您可以对其进行优化,但对于私人项目来说已经足够了。

训练你的系统后,如果你想知道图片上的人:

        cv.readImage(fileDir, function(err, im)
          if(err) res.send(err);
          var whoisit = FaceRecognizer.predictSync(im);
          console.log("Identified image", whoisit);
        );

在我的例子中,“whoisit”对象包含用户的 ID 和“置信度”值,表示 openCV 对图像上的人有多“确定”。 希望对您有所帮助。

【讨论】:

你好费尔!你是如何初始化 cvImages 的? var cvImages = []; ?还是应该与 cv 库链接? 嗨,Alexander,cvImages 只是一个空数组,所以 cvImages = []。 FaceRecognizer 需要一个带有 labelNumber(图像上的人的 id)和图像对象的矩阵 谢谢!想通了。你能帮帮我吗? 嗯,主要问题是什么?也许打开一个新问题,其他人也有机会帮助你:) 没有问题,只是想弄清楚人脸识别的最佳算法是什么,如何在 node js 中实现它们等等。我想要一些基本的建议

以上是关于使用 opencv 和 node 比较两个人脸的相似度的主要内容,如果未能解决你的问题,请参考以下文章

Android App人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)

OpenCV vs Dlib 人脸检测比较分析

利用OpenCV一天玩转人脸检测

opencv人脸识别用哪种方法比较好?Eigenfaces?Fisherfaces?LBP?

使用 C++ 和 opencv 进行人脸识别 [关闭]

opencv_人脸检测模型训练人脸识别