2016-03-10 57 views
0

我尝试使用nodejs和opencv进行人脸检测。使用OpenCV和nodejs进行人脸检测

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上做的之间存在很大的延迟。我该如何改进并删除“滞后”?

回答

1

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

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

我在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); 
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是针对滞后的原因。我只保存了文件,然后再读取并缓冲回来。我还添加了检测到的人脸数量。