Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 基于OpenCV和nodejs的人脸检测_Node.js_Opencv - Fatal编程技术网

Node.js 基于OpenCV和nodejs的人脸检测

Node.js 基于OpenCV和nodejs的人脸检测,node.js,opencv,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;

我正在尝试使用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);
};
var-cv=require('opencv');
//摄像机特性
var camWidth=320;
var camHeight=240;
var-camFps=10;
var camInterval=1000/camFps;
//人脸检测特性
var rectColor=[0,255,0];
var-rectThickness=1;
//初始化摄像机
var摄像机=新的cv.VideoCapture(0);
摄像头设置宽度(camWidth);
摄像头设置高度(camHeight);
module.exports=函数(套接字){
setInterval(函数(){
时间=新日期();
摄像头读取(功能(err、im){
如果(错误)抛出错误;
im.detectObject('/usr/lib/node_modules/opencv/data/lbpcascades/lbpcascade_frontalface.xml',{},函数(err,faces){
如果(错误)抛出错误;
对于(变量i=0;i

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

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

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

<>我在C++项目中也做了同样的事情。下面是我用来“跟踪”检测到的脸的代码(存储到与“脸”数组具有相同角色的
\u camFaces

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

  • 一个矩形,包含roi的尺寸和位置 在上一帧中
  • 以灰度表示的ROI。该ROi将用作模板,用于模板匹配算法
  • cv::Mat1b grayFrame=预处理器::灰色(帧)
    用于(自动和配对:_camFaces){
    cv::Mat1f dst;
    cv::matchTemplate(灰框、成对秒、dst、cv_TM_SQDIFF_赋范);
    双最小值,最大值;
    cv::minloc点、maxloc点;
    cv::minMaxLoc(dst,&minval,&maxval,&minloc,&maxloc);
    
    如果(minval当您获得第一个匹配时,您有一组ROI。此时您可以停止使用检测算法,并开始使用跟踪算法(使用运动估计,它将工作得更好)

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

    <>我在C++项目中做了同样的操作。这里是我用来跟踪被检测的人脸的代码(存储在<代码> 以下代码在触发检测后执行,并且_camFaces已填充一组对。 每对包括:

  • 一个矩形,包含roi的尺寸和位置 在上一帧中
  • 以灰度表示的ROI。该ROI将用作模板,用于模板匹配算法
  • cv::Mat1b grayFrame=预处理器::灰色(帧)
    用于(自动和配对:_camFaces){
    cv::Mat1f dst;
    cv::matchTemplate(灰框、成对秒、dst、cv_TM_SQDIFF_赋范);
    双最小值,最大值;
    cv::minloc点、maxloc点;
    cv::minMaxLoc(dst,&minval,&maxval,&minloc,&maxloc);
    如果(minval试试这个

    im.detectObject(cv.FACE_CASCADE,{},函数(err,faces){
    如果(错误)抛出错误;
    ;
    对于(变量i=0;i
    
    
    im.detectObject(cv.FACE_CASCADE,{},函数(err,faces){
    如果(错误)抛出错误;
    ;
    对于(变量i=0;i
    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);