Node.js 对于相同的图像,OpenCV检测到的面不在同一位置

Node.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)

我正在构建一个Npm包(),它利用OpenCV查找两个图像之间的差异

我写的代码似乎可以工作,但结果似乎常常非常错误,如果我输出检测到的人脸,它并不总是在图像的同一区域中。即使比较两张相同的蒙娜丽莎图像,我也很少得到0的absDiff

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已经内置了人脸识别功能?