我正在尝试显示一个实时流,由opencv4nodejs读取,并由人脸识别模块处理。这里的问题是,promise.then()不能工作。甚至没有在相应的条件下捕获()。(我是节点和承诺的新手。)预期工作流程:
读取帧从摄像头(通过cv.read) ->保存到缓冲区(由cv.imwrite) ->读取帧从缓冲区(由fr.loadImage) ->进程(由detector.locateFaces) ->显示->重复处理。
const fr = require('face-recognition');
const cv = require('opencv4nodejs');
const events = require('events');
const detector = fr.FaceDetector()
const cap = new cv.VideoCapture(0);
const win = new fr.ImageWindow()
const eventEmitter = new events.EventEmitter();
function process(){
console.log('process');
return new Promise(function(resolve,reject){
console.log('promise');
var frame = cap.read();
cv.imwrite(`${__dirname}/buffer/img.jpg`, frame);
if(frame != null)
resolve('resolve');
else
reject('Problem While reading');
});
}
eventEmitter.on('read',function(string){
console.log('event call');
var promise = process();
promise.then(function(string){
console.log(string);
const image = fr.loadImage(`${__dirname}/buffer/img.jpg`);
const faceRectangles = detector.locateFaces(image);
win.setImage(image);
fr.hitEnterToContinue();
}).catch(function(err){
console.log(err);
});
});
while(true){
console.log('emit');
eventEmitter.emit('read','abcd');
}
/*****expected output should be*****
emit
event call
process
promise
resolve
/*****getting output*****
emit
event call
process
promise
*/发布于 2018-12-06 18:02:39
const fr = require('face-recognition');
const cv = require('opencv4nodejs');
const events = require('events');
const detector = fr.FaceDetector()
const cap = new cv.VideoCapture(0);
const win = new fr.ImageWindow()
const eventEmitter = new events.EventEmitter();
function process(){
console.log('process');
return new Promise(function(resolve,reject){
console.log('promise');
var frame = cap.read();
cv.imwrite(`${__dirname}/buffer/img.jpg`, frame);
if(frame != null)
resolve('resolve');
else
reject('Problem While reading');
});
}
eventEmitter.on('read',function(string){
console.log('event call');
var promise = process();
console.log(promise);
promise.then(function(string){
console.log(string);
const image = fr.loadImage(`${__dirname}/buffer/img.jpg`);
const faceRectangles = detector.locateFaces(image);
console.log(faceRectangles);
win.setImage(image);
// fr.hitEnterToContinue();
eventEmitter.emit('read','abcd');
}).catch(function(err){
console.log(err);
});
});
eventEmitter.emit('read','abcd');更改:1)从eventEmitter.emit('read','abcd'); 2中删除while循环)在promise.then()中递归地发出事件--我观察到,在连续发射事件时,promise.then()不能工作,所以我在promise.then()中发出事件,所以现在它很好地工作。
发布于 2018-12-06 09:14:17
由于您正在使用eventEmitter,所以您的代码应该如下所示:
const fr = require('face-recognition');
const cv = require('opencv4nodejs');
const events = require('events');
const Promise = require('bluebird');
const detector = fr.FaceDetector()
const cap = new cv.VideoCapture(0);
const win = new fr.ImageWindow()
const eventEmitter = new events.EventEmitter();
function process(){
console.log('process');
return new Promise(function(resolve,reject) {
console.log('promise');
var frame = cap.read();
cv.imwrite(`${__dirname}/buffer/img.jpg`, frame);
if(frame != null)
resolve();
else
reject('Problem While reading');
});
}
eventEmitter.on('read',function(string){
console.log('event call');
var promise = process();
promise.then(function(string){
console.log(string);
const image = fr.loadImage(`${__dirname}/buffer/img.jpg`);
const faceRectangles = detector.locateFaces(image);
win.setImage(image);
fr.hitEnterToContinue();
}).catch(function(err){
console.log(err);
});
});
while(true){
console.log('emit');
eventEmitter.emit('read','abcd');
}https://stackoverflow.com/questions/53589876
复制相似问题