Node.js 对于相同的图像,OpenCV检测到的面不在同一位置
我正在构建一个Npm包(),它利用OpenCV查找两个图像之间的差异 我写的代码似乎可以工作,但结果似乎常常非常错误,如果我输出检测到的人脸,它并不总是在图像的同一区域中。即使比较两张相同的蒙娜丽莎图像,我也很少得到0的absDiffNode.js 对于相同的图像,OpenCV检测到的面不在同一位置,node.js,opencv,face-recognition,Node.js,Opencv,Face Recognition,我正在构建一个Npm包(),它利用OpenCV查找两个图像之间的差异 我写的代码似乎可以工作,但结果似乎常常非常错误,如果我输出检测到的人脸,它并不总是在图像的同一区域中。即使比较两张相同的蒙娜丽莎图像,我也很少得到0的absDiff var cv = require('opencv'); var async = require('async'); function Facematch () { this._detectObjects = function (im, callback)
var cv = require('opencv');
var async = require('async');
function Facematch () {
this._detectObjects = function (im, callback) {
var object, img;
var options = {
scale: 2
};
im.detectObject(cv.FACE_CASCADE, options, function (err, objects) {
if (err) return callback(err);
// console.log(objects);
if (objects.length === 0) return callback('No objects found');
for (var i in objects) {
object = objects[i];
img = im.roi(object.x, object.y, object.width, object.height);
self.faces.push(img);
}
callback();
});
};
this._calcDiff = function (callback) {
var im1 = self.faces[0];
var im2 = self.faces[1];
// im1.save('im1.jpg');
// im2.save('im2.jpg');
var diff = new cv.Matrix(im1.width(), im1.height());
diff.absDiff(im1, im2);
diff.convertGrayscale();
callback(null, diff.countNonZero());
};
var self = this;
this.ims = [];
this.faces = [];
}
Facematch.prototype.compare = function (img1, img2, callback) {
var self = this;
var images = [img1, img2];
var diff;
async.series([
function (callback) {
async.map(images, cv.readImage, function (err, results) {
if (err) return callback(err);
self.ims = results;
callback();
});
},
function (callback) {
async.each(self.ims, self._detectObjects, callback);
},
function (callback) {
if (self.faces.length < 2) return callback('Not enough faces');
self._calcDiff(function (err, result) {
if (err) return callback(err);
diff = result;
callback();
});
}
], function (err) {
callback(err, diff);
});
};
var imgFiles = ['Mona.jpg', 'Mona.jpg'];
var imgs = imgFiles.map(function (img) {
return __dirname + '/images/' + img;
});
var fm = new Facematch();
fm.compare(imgs[0], imgs[1], function (err, diff) {
if (err) throw err;
console.log('Images absDiff is %d', diff);
});
var-cv=require('opencv');
var async=require('async');
函数Facematch(){
此._detectObjects=函数(im,回调){
var对象,img;
变量选项={
比例:2
};
im.DetectoObject(cv.FACE_级联、选项、函数(错误、对象){
if(err)返回回调(err);
//console.log(对象);
if(objects.length==0)返回回调(“未找到对象”);
for(对象中的变量i){
对象=对象[i];
img=im.roi(object.x,object.y,object.width,object.height);
自我面推(img);
}
回调();
});
};
这是一个函数(回调){
var im1=自我面[0];
var im2=自我面孔[1];
//im1.save('im1.jpg');
//im2.save('im2.jpg');
var diff=新的cv.矩阵(im1.width(),im1.height());
diff.absDiff(im1,im2);
差分转换灰度();
回调(null,diff.countNonZero());
};
var self=这个;
this.ims=[];
this.faces=[];
}
Facematch.prototype.compare=函数(img1、img2、回调){
var self=这个;
var图像=[img1,img2];
var-diff;
异步系列([
函数(回调){
map(图像、cv.readImage、函数(错误、结果){
if(err)返回回调(err);
self.ims=结果;
回调();
});
},
函数(回调){
async.each(self.ims、self.\u检测对象、回调);
},
函数(回调){
if(self.faces.length<2)返回回调(“没有足够的面”);
self.\u calcDiff(函数(错误、结果){
if(err)返回回调(err);
diff=结果;
回调();
});
}
],函数(err){
回调(err,diff);
});
};
var imgFiles=['Mona.jpg','Mona.jpg'];
var imgs=imgFiles.map(函数(img){
返回_udirname+'/images/'+img;
});
var fm=新的Facematch();
fm.比较(imgs[0],imgs[1],函数(err,diff){
如果(错误)抛出错误;
console.log('Images absDiff为%d',diff);
});
更新
如果我将{scale:2}
作为选项传递给detectObject
Mona-Lisa匹配,但对于其他图像,它找不到人脸。
我想这意味着在比较之前,图像应该缩放到相同的大小?这里是Mona:那些是jpg图像吗?有损压缩将破坏任何像素级比较的尝试。是的,看看Mona。我确实得到了absDiff 0,但很少,我觉得这很奇怪。当我运行测试时,我得到的图像absDiff是4574。通常在3000到5000之间。你知道吗,opencv已经内置了人脸识别功能?