使用opencv和node来比较2个面的相似性

Bil*_*ill 5 opencv face-recognition node.js

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

 var snap = function(){
Run Code Online (Sandbox Code Playgroud)

vid.read(function(err,im){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')
})
Run Code Online (Sandbox Code Playgroud)

}); } snap()

谢谢

Fer*_* To 5

我相信你正在使用node-opencv库?您将需要更多步骤.你必须训练你的opencv系统,它允许你使用FaceRecongizer()中的方法"predictSync".

node-opencv库有一个FaceRecognizer对象,您首先要初始化它.

  1. 初始化FaceRecognizer: var FaceRecognizer = new cv.FaceRecognizer();
  2. 你必须阅读所有图像,创建一个特定的数组并训练你的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!");
    }
    });`  
    
    Run Code Online (Sandbox Code Playgroud)

我敢肯定,你可以优化它,但对于一个私人项目来说它已经足够了.

培训完系统后,如果您想了解图像上的人:

        cv.readImage(fileDir, function(err, im){
          if(err) res.send(err);
          var whoisit = FaceRecognizer.predictSync(im);
          console.log("Identified image", whoisit);
        });
Run Code Online (Sandbox Code Playgroud)

在我的例子中,"whoisit"对象包含用户的ID和"置信度"值,意味着openCV对于图像上的人是多么"确定".希望能帮助到你.