我尝试使用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上看到的周围有矩形的图像之间产生很大的延迟。如何改进并删除“滞后”?
答案 0 :(得分:1)
当你获得第一场比赛时,你有一套投资回报率。此时,您可以停止使用检测算法并开始使用跟踪算法(使用运动估计可以更好地工作)。
如果您不希望/需要跟踪算法的性能,您可以回退模板匹配算法。将检测到的面部用作模板,将当前帧用作目标图像。
我在C ++项目中做了同样的事情。这是我以前使用的代码&#34; track&#34;检测到的面(存储在与{faces&#39;数组相同的角色)的_camFaces
中。
以下代码在检测到触发后执行,_camFaces已填充一组对。 每对包括:
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是造成这种滞后的原因。我刚刚保存了文件,然后再次读取并缓冲回来。我还添加了检测到的面部数量。