2016-03-10 98 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是針對滯後的原因。我只保存了文件,然後再讀取並緩衝回來。我還添加了檢測到的人臉數量。