使用OpenCV和nodejs进行人脸检测

时间:2016-03-10 17:57:34

标签: node.js opencv

我尝试使用nodejs和opencv进行面部检测。

var cv = require('opencv');

// camera properties
var camWidth = 320;
var camHeight = 240;
var camFps = 10;
var camInterval = 1000 / camFps;

// face detection properties
var rectColor = [0, 255, 0];
var rectThickness = 1;

// initialize camera
var camera = new cv.VideoCapture(0);
camera.setWidth(camWidth);
camera.setHeight(camHeight);

module.exports = function (socket) {
  setInterval(function() {
    sTime = new Date();
    camera.read(function(err, im) {
      if (err) throw err;
        im.detectObject('/usr/lib/node_modules/opencv/data/lbpcascades/lbpcascade_frontalface.xml', {}, function(err, faces) {
          if (err) throw err;

          for (var i = 0; i < faces.length; i++) {
            face = faces[i];
            im.rectangle([face.x, face.y], [face.width, face.height], rectColor, rectThickness);
          }
          socket.emit('frame', { buffer: im.toBuffer() });
        });
    });
  }, camInterval);
};

im.detectObject需要80/120秒才能执行,随着时间的推移,它会在相机看到的实际图像与我在PC上看到的周围有矩形的图像之间产生很大的延迟。如何改进并删除“滞后”?

2 个答案:

答案 0 :(得分:1)

当你获得第一场比赛时,你有一套投资回报率。此时,您可以停止使用检测算法并开始使用跟踪算法(使用运动估计可以更好地工作)。

如果您不希望/需要跟踪算法的性能,您可以回退模板匹配算法。将检测到的面部用作模板,将当前帧用作目标图像。

我在C ++项目中做了同样的事情。这是我以前使用的代码&#34; track&#34;检测到的面(存储在与{faces&#39;数组相同的角色)的_camFaces中。

以下代码在检测到触发后执行,_camFaces已填充一组对。 每对包括:

  1. 一个矩形,包含roi的尺寸和位置 在前一帧中。
  2. 投资回报率,灰度。该ROi将用作模板匹配算法的模板。
  3. cv::Mat1b grayFrame = Preprocessor::gray(frame)
    for (auto& pair : _camFaces) {
      cv::Mat1f dst;
      cv::matchTemplate(grayFrame, pair.second, dst, CV_TM_SQDIFF_NORMED);
    
      double minval, maxval;
      cv::Point minloc, maxloc;
      cv::minMaxLoc(dst, &minval, &maxval, &minloc, &maxloc);
    
      if (minval <= 0.2) {
        pair.first.x = minloc.x;
        pair.first.y = minloc.y;
        noneTracked = false;
      } else {
        pair.first.x = pair.first.y = pair.first.width = pair.first.height = 0;
      }
    }
    // draw rectangles
    cv::Mat frame2;
    frame.copyTo(frame2);
    
    for (const auto& pair : _camFaces) {
      cv::rectangle(frame2, pair.first, cv::Scalar(255, 255, 0), 2);
    }
    _updateCamView(frame2);
    

答案 1 :(得分:1)

试试这个

 im.detectObject(cv.FACE_CASCADE, {}, function(err, faces) {
        if (err) throw err;
;
        for (var i = 0; i < faces.length; i++) {
          var f1 = faces.length;
          face = faces[i];
          im.rectangle([face.x, face.y], [face.width, face.height], rectColor, rectThickness);
        }

      
      im.save('image.jpg');

        console.log('image saved');
        console.log(f1);
        fs.readFile('image.jpg', function (err, buffer) {
          socket.emit('image', {buffer: buffer , faces : f1 });
        });

im.toBuffer是造成这种滞后的原因。我刚刚保存了文件,然后再次读取并缓冲回来。我还添加了检测到的面部数量。