使用 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比较两张人脸相似程度实战(附源码和演示 超详细)