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

我有openCV和nodejs运行,我的目标是创build一个程序,当它看到它时(已经做到了)拍摄一张人脸照片,然后将该人脸与各种人脸进行比较来查看是否匹配。 我会知道谁的脸是谁在分贝,所以基本上我就知道谁的脸上的网站拍了照片。 我得到了下面的代码来拍摄照片并保存它…但我不知道如何获得测量结果或与另一张脸进行比较,我find了图像比较的例子,但我想我需要面部比较。

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

}); snap()

谢谢

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

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

  1. 初始化FaceRecognizer: var FaceRecognizer = new cv.FaceRecognizer();
  2. 你必须阅读所有的图像,创build一个特定的数组,并用它来训练你的FaceRecognizer。 为了达到我的目的,我将每个用户都保存在一个数据库中,并且他们获得了一个唯一的ID,用于创build特定的子文件夹,并在稍后使用。 这是我的代码:

     //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是如何关于图像上的人的。 希望能帮助到你。

Interesting Posts