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

 var snap = function(){

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')
})

});
}
折断()

谢谢

最佳答案

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

node-opencv库具有您首先初始化的FaceRecognizer对象。

  • 初始化FaceRecognizer:var FaceRecognizer = new cv.FaceRecognizer();
  • 您必须阅读所有图像,创建一个特定的数组,并以此训练您的FaceRecognizer。出于我的目的,我将每个用户保存在一个数据库中,他们得到一个唯一的ID,我将使用该ID来创建特定的子文件夹,以后将使用该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!");
    }
    });`
    

  • 我敢肯定,您可以对其进行优化,但是对于一个私有(private)项目来说已经足够了。

    训练完系统后,如果您想了解图像上的人:
            cv.readImage(fileDir, function(err, im){
              if(err) res.send(err);
              var whoisit = FaceRecognizer.predictSync(im);
              console.log("Identified image", whoisit);
            });
    

    在我的案例中,“whoisit”对象包含用户的ID和“confidence”值,这意味着openCV如何“确定”图像上的人。
    希望能帮助到你。

    关于node.js - 使用opencv和node比较2个面孔的相似度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21647573/

    10-14 16:57
    查看更多