当前位置: 首页 > 后端技术 > Node.js

node+vue实现视频中的人脸识别

时间:2023-04-03 13:20:38 Node.js

先来看看识别效果。人脸识别的思路就是视频中的人脸识别。说白了就是图片的识别,因为视频的每一帧都是一张图片,我们只需要对每一帧图片的人脸进行识别,就可以实现视频的人脸识别。大致思路是:截取视频中的图片,然后发送给服务器进行识别,并将识别结果(坐标和宽高)回传给前端,由前端进行标注。现在开始第一步:我们需要从视频中抓取图片,那么现在有三个问题,1.如何从视频中抓取图片;2、截图的频率是多少?3、如何将图片传到服务器?回答第一个问题:使用Canvas的toDataURL方法。该方法可以将视频画面实时转换为Base64图像编码,高效便捷。回答第二个问题:当画面的帧率高于每秒10-12帧左右时,人眼会认为是连贯的。那么我们先取一个低值,每隔100毫秒截屏一次,回答第三个问题:你用Ajax吗?当然,但不完全正确。对于这种前后端频繁传输数据的情况,使用Websocket是最好的选择。前后端我们选择socket.io来实现第二步:Node端识别图片。在图像识别领域,opencv是标准方案,但是opencv是用C++写的,也有Java和Python接口,但是没有JS接口,难道就没有办法了吗?当然不是,一些大神已经导出了Node版本,叫做node-opencv,node-opencv并没有重写opencv,而是在Node层调用C++层的cv,最后在C++中运行。安装opencv和node-opencv可以比作之前的文章——Mac下安装node-opencv,这个东西比较难安装,折腾了好久才安装使用node-opencv识别图片中的人脸,核心代码如下://importopencvconstcv=require('opencv')//fileName是我们前端Base64传递给后端生成真实图片的地址//cv.FACE_CASCADE参数是训练集,因为人脸只是cv的一个应用领域,还可以识别汽车、动物、植物、建筑等物体,你通过什么训练集,他就识别什么cv.readImage(fileName,function(err,im){im.detectObject(cv.FACE_CASCADE,{},function(err,faces){//为什么是复数?因为一张图片中可能有多个人脸,每个人脸有四个值:x/y/width/height,这四个console.log(faces)的基本值})})确定了坐标和宽高后,就可以通过websocket把这些信息传递给前端,前端显示具体的技术细节。请移步Github:人脸识别源码