我正在尝试构建一个面部识别模块以在我的项目中使用它。此模块稍后将在electron.js中用于构建跨平台应用程序。
基本思想是:
向用户显示一个显示其网络摄像头供稿的网页。他/她可以单击捕获按钮,这会将图像保存在服务器端。这将重复多次以获取训练数据以训练面部识别模型。我使用名为“ node-webcam”的第三方npm模块实现了图像捕获部分:
const nodeWebCam = require('node-webcam');
const fs = require('fs');
const app = require('express')();
const path = require('path');
// specifying parameters for the pictures to be taken
var options = {
width: 1280,
height: 720,
quality: 100,
delay: 1,
saveShots: true,
output: "jpeg",
device: false,
callbackReturn: "location"
};
// create instance using the above options
var webcam = nodeWebCam.create(options);
// capture function that snaps <amount> images and saves them with the given name in a folder of the same name
var captureShot = (amount, i, name) => {
var path = `./images/${name}`;
// create folder if and only if it does not exist
if(!fs.existsSync(path)) {
fs.mkdirSync(path);
}
// capture the image
webcam.capture(`./images/${name}/${name}${i}.${options.output}`, (err, data) => {
if(!err) {
console.log('Image created')
}
console.log(err);
i++;
if(i <= amount) {
captureShot(amount, i, name);
}
});
};
// call the capture function
captureShot(30, 1, 'robin');
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(3000, () => {
console.log("Listening at port 3000....");
});
但是,这部分之后我迷路了。我不知道如何将实时供稿显示在用户看到的网页上。另外,我后来意识到这是服务器端代码,无法从客户端调用captureShot()函数。任何帮助将不胜感激。
答案 0 :(得分:0)
将捕获的镜头转换为诺言,然后在路线中进行渲染。我们将设置一个运行函数的路由,然后使用HTML字符串将路径返回到图像。我不知道如何从您的函数返回数据以制作图像。但是,假设它返回的确切路径,则可以解析回调的路径。
您还需要创建一个由express服务的静态目录。因此,您可以使用http://localhost:3000/myimage.jpg
const nodeWebCam = require('node-webcam');
const fs = require('fs');
const app = require('express')();
const path = require('path');
app.use(express.static('images')) // images folder to be served
// Now we can just say localhost:3000/image.jpg
// specifying parameters for the pictures to be taken
var options = {
width: 1280,
height: 720,
quality: 100,
delay: 1,
saveShots: true,
output: "jpeg",
device: false,
callbackReturn: "location"
};
// create instance using the above options
var webcam = nodeWebCam.create(options);
// capture function that snaps <amount> images and saves them with the given name in a folder of the same name
var captureShot = (amount, i, name) => {
// Make sure this returns a real url to an image.
return new Promise(resolve => {
var path = `./images/${name}`;
// create folder if and only if it does not exist
if(!fs.existsSync(path)) {
fs.mkdirSync(path);
}
// capture the image
webcam.capture(`./images/${name}/${name}${i}.${options.output}`, (err, data) => {
if(!err) {
console.log('Image created')
}
console.log(err);
i++;
if(i <= amount) {
captureShot(amount, i, name);
}
resolve('/path/to/image.jpg')
});
})
};
// call the capture function
app.get('/', (req, res) => {
captureShot(30, 1, 'robin');
.then((response) => {
// Whatever we resolve in captureShot, that's what response will contain
res.send('<img src="${response}"/>')
})
});
app.listen(3000, () => {
console.log("Listening at port 3000....");
});
如果您要设计具有特定动态内容的页面。使用带有express的模板引擎,例如EJS。 http://ejs.co然后,您可以使用动态对象渲染页面。并在拍照后为用户动态设置<img src=<%= image %>/>
。
我举了一个Promise的例子,然后使用带有express的静态目录。您可以了解我在说什么。
function create() {
return new Promise(resolve => {
if (true) {
resolve('https://example.com/image.jpg')
} else {
reject('Error')
}
})
}
create()
.then((response) => {
console.log(`<img src="${response}"/>`)
})
.catch((error) => {
// Error
console.log(error)
})
答案 1 :(得分:0)
我正在研究基于puppeteer(无头的Google chrome)的解决方案,该解决方案具有超强的便携性,并且可以以可接受的速度(40fps 800x600帧)流式传输视频。它非常易于安装和使用,并且我已经使用它来捕获基于gtk,cairo,opengl和qt的桌面应用程序上的视频,音频和桌面,而没有任何问题。
https://www.npmjs.com/package/camera-capture
我对opencv很熟悉,但是基于此的库确实很难被新用户安装。我的项目不需要任何本地依赖项或客户端-服务器通信,尽管它对于嵌入小型设备(伪造者的大小约为80mb)而言可能是非轻量级的。欢迎反馈!谢谢