使用face-api实现html前端摄像头人脸检测

face-api的github链接:face-api.js

里面的readme写的有点难以理解,再附一个讲解的网址:讲解如何使用webcam实现人脸检测:Build Real Time Face Detection With JavaScript
本文代码基本就是这个视频里的代码扒过来的,看不了视频的直接看这篇文章就可以了。

1. 准备
  1. 下载face-api:https://github.com/justadudewhohacks/face-api.js.git
  2. 新建一个自己的文件夹,将刚才下好的face-api.js目录里的/dist/face-api.min.js复制到自己的文件夹下,然后再把/weights文件夹直接全部拖到自己的目录下,新建index.html和face_detect.js。这里的目录设置如图所示:
    自己新建文件夹目录
2. 代码文件
  1. index.html的代码如下:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Face Detection</title>
    <script defer src="face-api.min.js"></script>
    <script defer src="face_detect.js"></script>
    <style>
      body {
        margin: 0;
        padding: 0;
        width: 100vw;
        height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
      }
      canvas {
        position: absolute;
      }
    </style>
  </head>
  <body>
    <video id="video" width="720" height="560" autoplay muted></video>
  </body>
</html>
  1. face_detect.js的代码如下:
const video = document.getElementById('video')

Promise.all([
    faceapi.nets.tinyFaceDetector.loadFromUri('./models'),
    faceapi.nets.faceLandmark68Net.loadFromUri('./models'),
    faceapi.nets.faceRecognitionNet.loadFromUri('./models'),
    faceapi.nets.faceExpressionNet.loadFromUri('./models'),
]).then(startVideo);

function startVideo() {
    navigator.getUserMedia(
      { video: {} },
      (stream) => (video.srcObject = stream),
      (err) => console.error(err)
    );
  }
  
video.addEventListener("play", () => {
    const canvas = faceapi.createCanvasFromMedia(video);
    document.body.append(canvas);
    const displaySize = { width: video.width, height: video.height };
    faceapi.matchDimensions(canvas, displaySize);
    setInterval(async () => {
      const detections = await faceapi
        .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions())
        .withFaceLandmarks()
        .withFaceExpressions();
      const resizedDetections = faceapi.resizeResults(detections, displaySize);
      canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height);
      faceapi.draw.drawDetections(canvas, resizedDetections);
      faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);
      faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
    }, 100);
  });

大功告成~似乎是不能直接点击index.html运行的,会报404的错误(找不到face-api的model),可以用vscode之类的服务端来打开。配合python下的tornado网络框架使用也可。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前端实现人脸识别需要使用到浏览器内置的WebRTC技术,结合第三方人脸识别实现。以下是一个简单的前端人脸识别的示例代码: ```html <!DOCTYPE html> <html> <head> <title>前端人脸识别</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/face-api.js/0.19.6/face-api.min.js"></script> </head> <body> <h1>前端人脸识别</h1> <div> <video id="video" width="640" height="480" autoplay muted></video> <canvas id="canvas" width="640" height="480"></canvas> </div> <script> // 获取video元素 const video = document.getElementById("video"); // 获取canvas元素 const canvas = document.getElementById("canvas"); // 获取canvas画布 const context = canvas.getContext("2d"); // 获取摄像头视频流 navigator.mediaDevices .getUserMedia({ video: true, audio: false }) .then((stream) => { video.srcObject = stream; }) .catch((error) => { console.log(error); }); // 加载人脸识别模型 Promise.all([ faceapi.nets.tinyFaceDetector.loadFromUri( "https://cdn.bootcdn.net/ajax/libs/face-api.js/0.19.6/models/" ), faceapi.nets.faceLandmark68Net.loadFromUri( "https://cdn.bootcdn.net/ajax/libs/face-api.js/0.19.6/models/" ), faceapi.nets.faceRecognitionNet.loadFromUri( "https://cdn.bootcdn.net/ajax/libs/face-api.js/0.19.6/models/" ), faceapi.nets.faceExpressionNet.loadFromUri( "https://cdn.bootcdn.net/ajax/libs/face-api.js/0.19.6/models/" ), ]).then(startVideo); // 开始视频播放 function startVideo() { video.play(); // 每100毫秒检测一次人脸 setInterval(detectFaces, 100); } // 检测人脸 function detectFaces() { context.drawImage(video, 0, 0, 640, 480); faceapi .detectAllFaces(canvas, new faceapi.TinyFaceDetectorOptions()) .withFaceLandmarks() .withFaceExpressions() .then((faces) => { // 清空画布 context.clearRect(0, 0, canvas.width, canvas.height); // 绘制检测到的人脸位置和表情 faceapi.draw.drawDetections(canvas, faces); faceapi.draw.drawFaceLandmarks(canvas, faces); faceapi.draw.drawFaceExpressions(canvas, faces); // 发送检测结果给后端进行处理 $.ajax({ type: "POST", url: "http://localhost:8000", data: { faces: JSON.stringify(faces) }, }); }); } </script> </body> </html> ``` 以上代码使用face-api.js这个人脸识别库,可以检测人脸位置、表情等信息,并将检测结果发送给后端进行处理。需要注意的是,由于涉及到摄像头和浏览器的安全限制,代码需要在服务器上运行才能正常使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值