【问题标题】:face detection with OpenCV and nodejs使用 OpenCV 和 nodejs 进行人脸检测
【发布时间】:2016-06-17 19:29:01
【问题描述】:

我正在尝试使用 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 上看到的脸部周围的矩形之间产生很大的延迟。我该如何改进并删除“滞后”?

【问题讨论】:

    标签: node.js opencv


    【解决方案1】:

    当您获得第一场比赛时,您就有了一组 ROI。此时您可以停止使用检测算法并开始使用跟踪算法(使用运动估计会更好地工作)。

    如果您不想要/不需要跟踪算法的性能,您可以使用模板匹配算法。将检测到的人脸作为模板,将当前帧作为目标图像。

    我在 C++ 项目中做了同样的事情。这是我用来“跟踪”检测到的人脸的代码(存储在_camFaces 中,与您的“人脸”数组具有相同的作用)。

    下面的代码在触发检测并且 _camFaces 已被一组对填充后执行。 每对包括:

    1. 一个矩形,包含 roi 的尺寸和位置 在上一帧中。
    2. ROI,灰度。该 ROi 将用作模板匹配算法的模板。

    .

    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);
    

    【讨论】:

      【解决方案2】:

      试试这个

       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 是造成这种滞后的原因。我只是保存了文件,然后再次读取并将其缓冲回来。我还将检测到的人脸数量添加到了发射中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        • 2013-03-23
        • 2017-10-02
        • 1970-01-01
        • 2012-05-18
        • 2011-06-22
        • 2014-06-12
        相关资源
        最近更新 更多