返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用VUE+faceApi.js实现摄像头拍摄人脸识别
  • 454
分享到

如何使用VUE+faceApi.js实现摄像头拍摄人脸识别

face api.js 人脸识别vue实现人脸识别人脸识别 js 2023-05-18 17:05:02 454人浏览 安东尼
摘要

目录需求:实现步骤:第一步:下载引入必要包下载依赖下载model将项目中的model放入Vue中的public文件加下第二步:先把html写上去 第三步 可以开始

需求:

前端获取到摄像头信息,通过模型来进行判断人像是否在镜头中,镜头是否有被遮挡。

实现步骤:

1、通过video标签来展示摄像头中的内容

2、通过canvas来绘制视频中信息进行展示

3、在拍照时候将canvas的当前帧转成图片

第一步:下载引入必要包

下载依赖

face-api.js是核心依赖必须要下

npm install face-api.js

element-ui为了按钮好看一点(可以不下) ,axiOS用于请求发送

npm istall element-ui axios -S

 element-ui根据官方文档进行引入使用

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.CSS';
import App from './App.vue';
Vue.use(ElementUI);
new Vue({
  el: '#app',
  render: h => h(App)
});

下载model

下载地址: 模板地址

将项目中的model放入VUE中的public文件加下

第二步:先把HTML写上去 

<template>
    <div>
        <el-button type="primary" @click="useCamera">打开摄像头</el-button>
        <el-button type="plain" @click="photoShoot">拍照</el-button>
        <el-alert
            :title="httpsAlert"
            type="info"
            :closable="false"
            v-show="HttpsAlert !== ''">
        </el-alert>
        <div class="videoImage" ref="faceBox">
            <video ref="video" style="display: none;"></video>
            <canvas ref="canvas" width="400" height="400" v-show="videoShow"></canvas>
            <img ref="image" :src="picture" alt="" v-show="pictureShow">
        </div>
    </div>
</template>

第三步 可以开始代码了

首先引入下载好的face-api.js包

import * as faceApi from 'face-api.js'

 以下是需要用到的属性

1、视频和图片不同时出现

videoShow: false,
pictureShow: false,

2、生成图片后用于保存图片路径

picture: '',

3、因为在操作时会用到DOM所以将要用到虚拟DOM保存在data中

canvas: null,
video: null,
image: null,

 4、模型识别时直接传入此属性,在初始化时赋值(可省略,直接卸载逻辑代码中)

options: ''

 5、在人脸识别时对结果进行反馈(识别出人像数量大于1或小于1时给出提示)

noOne: '',
moreThanOne: '',

6、如果用户不是在https下进行使用摄像头调用给出提示

httpsAlert: ''

属性准备好之后就可以开始初始化了

1、初始化模型

2、获取需要用到的虚拟DOM

async init() {
    await faceApi.nets.ssdMobilenetv1.loadFromUri("/models");
    await faceApi.loadFaceLandmarkModel("/models");
    this.options = new faceApi.SsdMobilenetv1Options({
        minConfidence: 0.5, // 0.1 ~ 0.9
    });
    // 视频中识别使用的节点
    this.video = this.$refs.video
    this.canvas = this.$refs.canvas
    this.image = this.$refs.image
}

调用摄像头

通过navigator.mediaDevices.getUserMedia()

useCamera(){
    this.videoShow = true
    this.pictureShow = false
    this.cameraoptions()
},
cameraOptions(){
    let constraints = {
        video: {
            width: 400,
            height: 400
        }
    }
    // 如果不是通过loacalhost或者通过https访问会将报错捕获并提示
    try{
        let promise = navigator.mediaDevices.getUserMedia(constraints);
        promise.then((MediaStream) => {
            // 返回参数
            this.video.srcObject = MediaStream;
            this.video.play();
            this.recognizeFace()
        }).catch((error) => {
            console.log(error);
        });
    }catch(err){
        this.httpsAlert = `您现在在使用非Https访问,
        请先在chrome://flags/#unsafely-treat-insecure-origin-as-secure中修改配置,
        添将当前链接${window.location.href}添加到列表,
        并且将Insecure origins treated as secure修改为enabled,
        修改完成后请重启浏览器后再次访问!`
    }
}

识别视频中的人像

这里通过递归的方式将视频中的内容用canvas显示

将canvas的节点传入到faceApi的方法中进行识别

通过faceApi返回的数组可以得到当前人脸的识别状况(数组长度0没有识别到人脸,长度1识别到一个人脸...以此类推)

async recognizeFace(){
    if (this.video.paused) return clearTimeout(this.timeout);
    this.canvas.getContext('2d', { willReadFrequently: true }).drawImage(this.video, 0, 0, 400, 400);
    const results = await faceApi.detectAllFaces(this.canvas, this.options).withFaceLandmarks();
    if(results.length === 0){
        if(this.moreThanOne !== ''){
            this.moreThanOne.close()
            this.moreThanOne = ''
        }
        if(this.noOne === ''){
            this.noOne = this.$message({
                message: '未识别到人脸',
                type: 'warning',
                duration: 0
            });
        }
    }else if(results.length > 1){
        if(this.noOne !== ''){
            this.noOne.close()
            this.noOne = ''
        }
        if(this.moreThanOne === ''){
            this.moreThanOne = this.$message({
                message: '检测到镜头中有多个人',
                type: 'warning',
                duration: 0
            });
        }
    }else{
        if(this.noOne !== ''){
            this.noOne.close()
            this.noOne = ''
        }
        if(this.moreThanOne !== ''){
            this.moreThanOne.close()
            this.moreThanOne = ''
        }
    }
    this.timeout = setTimeout(() => {
        return this.recognizeFace()
    });
},

拍照上传 

async photoShoot(){
    // 拿到图片的base64
    let canvas = this.canvas.toDataURL("image/png");
    // 拍照以后将video隐藏
    this.videoShow = false
    this.pictureShow = true
    // 停止摄像头成像
    this.video.srcObject.getTracks()[0].stop()
    this.video.pause()
    if(canvas) {
        // 拍照将base64转为file流文件
        let blob = this.dataURLtoBlob(canvas);
        let file = this.blobToFile(blob, "imgName");
        // 将blob图片转化路径图片
        let image = window.URL.createObjectURL(file)
        this.picture = image
        return
        let fORMData = new FormData()
        formData.append('file', this.picture)
        axios({
            method: 'post',
            url: '/user/12345',
            data: formData
        }).then(res => {
            console.log(res)
        }).catch(err => {
            console.log(err)
        })
    } else {
        console.log('canvas生成失败')
    }
},

需要用到的图片格式转换方法 

方法1:先将base64转为文件

方法2:设置新的文件中的参数信息

dataURLtoBlob(dataurl) {
    let arr = dataurl.split(','),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
    while(n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {
        type: mime
    });
},
blobToFile(theBlob, fileName) {
    theBlob.lastModifiedDate = new Date().toLocaleDateString();
    theBlob.name = fileName;
    return theBlob;
},

完整代码

import bingImage from '@/assets/bbt1.jpg';
import BingWallpaper from '@/assets/BingWallpaper.jpg';
import * as faceApi from 'face-api.js'
export default {
    name: 'Recognize',
    data(){
        return{
            videoShow: false,
            pictureShow: false,
            // 图片地址
            picture: '',
            // 用于视频识别的节点
            canvas: null,
            video: null,
            image: null,
            timeout: 0,
            // 模型识别的条件
            options: '',
            // 提示控制
            noOne: '',
            moreThanOne: '',
            // 不是通过Https访问提示
            httpsAlert: '',
        }
    },
    mounted() {
        // 初始化
        this.init()
    },
    beforeDestroy() {
        clearTimeout(this.timeout);
    },
    methods: {
        async init() {
            await faceApi.nets.ssdMobilenetv1.loadFromUri("/models");
            await faceApi.loadFaceLandmarkModel("/models");
            this.options = new faceApi.SsdMobilenetv1Options({
                minConfidence: 0.5, // 0.1 ~ 0.9
            });
            // 视频中识别使用的节点
            this.video = this.$refs.video
            this.canvas = this.$refs.canvas
            this.image = this.$refs.image
        },
        
        useCamera(){
            this.videoShow = true
            this.pictureShow = false
            this.cameraOptions()
        },
        
        cameraOptions(){
            let constraints = {
                video: {
                    width: 400,
                    height: 400
                }
            }
            // 如果不是通过loacalhost或者通过https访问会将报错捕获并提示
            try{
                let promise = navigator.mediaDevices.getUserMedia(constraints);
                promise.then((MediaStream) => {
                    // 返回参数
                    this.video.srcObject = MediaStream;
                    this.video.play();
                    this.recognizeFace()
                }).catch((error) => {
                    console.log(error);
                });
            }catch(err){
                this.httpsAlert = `您现在在使用非Https访问,
                请先在chrome://flags/#unsafely-treat-insecure-origin-as-secure中修改配置,
                添将当前链接${window.location.href}添加到列表,
                并且将Insecure origins treated as secure修改为enabled,
                修改完成后请重启浏览器后再次访问!`
            }
        },
        
        async recognizeFace(){
            if (this.video.paused) return clearTimeout(this.timeout);
            this.canvas.getContext('2d', { willReadFrequently: true }).drawImage(this.video, 0, 0, 400, 400);
            const results = await faceApi.detectAllFaces(this.canvas, this.options).withFaceLandmarks();
            if(results.length === 0){
                if(this.moreThanOne !== ''){
                    this.moreThanOne.close()
                    this.moreThanOne = ''
                }
                if(this.noOne === ''){
                    this.noOne = this.$message({
                        message: '未识别到人脸',
                        type: 'warning',
                        duration: 0
                    });
                }
            }else if(results.length > 1){
                if(this.noOne !== ''){
                    this.noOne.close()
                    this.noOne = ''
                }
                if(this.moreThanOne === ''){
                    this.moreThanOne = this.$message({
                        message: '检测到镜头中有多个人',
                        type: 'warning',
                        duration: 0
                    });
                }
            }else{
                if(this.noOne !== ''){
                    this.noOne.close()
                    this.noOne = ''
                }
                if(this.moreThanOne !== ''){
                    this.moreThanOne.close()
                    this.moreThanOne = ''
                }
            }
            // 通过canvas显示video信息
            this.timeout = setTimeout(() => {
                return this.recognizeFace()
            });
        },
        
        async photoShoot(){
            // 拿到图片的base64
            let canvas = this.canvas.toDataURL("image/png");
            // 拍照以后将video隐藏
            this.videoShow = false
            this.pictureShow = true
            // 停止摄像头成像
            this.video.srcObject.getTracks()[0].stop()
            this.video.pause()
            if(canvas) {
                // 拍照将base64转为file流文件
                let blob = this.dataURLtoBlob(canvas);
                console.log(blob)
                let file = this.blobToFile(blob, "imgName");
                console.info(file);
                // 将blob图片转化路径图片
                let image = window.URL.createObjectURL(file)
                this.picture = image
                // 将拍照后的图片发送给后端
                let formData = new FormData()
                formData.append('file', this.picture)
                axios({
                    method: 'post',
                    url: '/user/12345',
                    data: formData
                }).then(res => {
                    console.log(res)
                }).catch(err => {
                    console.log(err)
                })
            } else {
                console.log('canvas生成失败')
            }
        },
        
        dataURLtoBlob(dataurl) {
            let arr = dataurl.split(','),
                mime = arr[0].match(/:(.*?);/)[1],
                bstr = atob(arr[1]),
                n = bstr.length,
                u8arr = new Uint8Array(n);
            while(n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], {
                type: mime
            });
        },
        
        blobToFile(theBlob, fileName) {
            theBlob.lastModifiedDate = new Date().toLocaleDateString();
            theBlob.name = fileName;
            return theBlob;
        },
    }
}

总结

到此这篇关于如何使用VUE+faceApi.js实现摄像头拍摄人脸识别的文章就介绍到这了,更多相关VUE faceApi.js摄像头拍摄人脸识别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何使用VUE+faceApi.js实现摄像头拍摄人脸识别

本文链接: https://lsjlt.com/news/212299.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用VUE+faceApi.js实现摄像头拍摄人脸识别
    目录需求:实现步骤:第一步:下载引入必要包下载依赖下载model将项目中的model放入VUE中的public文件加下第二步:先把HTML写上去 第三步 可以开始...
    99+
    2023-05-18
    face api.js 人脸识别 vue实现人脸识别 人脸识别 js
  • Html5中如何调用手机摄像头并实现人脸识别
    这篇文章主要介绍了Html5中如何调用手机摄像头并实现人脸识别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。需求混合App开发,原生壳子+webApp,在web部分调用原生摄...
    99+
    2023-06-09
  • AI摄像头如何探测物体和识别人脸
    AI摄像头通常使用深度学习算法来探测物体和识别人脸。以下是一般的步骤:1. 物体探测:AI摄像头使用卷积神经网络(CNN)等深度学习...
    99+
    2023-09-22
    AI
  • Python如何实现调用摄像头拍摄照片
    本文小编为大家详细介绍“Python如何实现调用摄像头拍摄照片”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何实现调用摄像头拍摄照片”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。步骤用opencv...
    99+
    2023-07-02
  • Python实现调用摄像头拍摄照片
    目录步骤代码实现效果步骤 用opencv打开摄像头并拍照保存照片到本地获取邮箱(如qq邮箱)的授权码,方法可自行百度将照片以附件的形式发送到指定邮箱删除本地照片 代码 import ...
    99+
    2024-04-02
  • Vue调用PC摄像头实现拍照功能
    本文实例为大家分享了Vue调用PC摄像头实现拍照功能的具体代码,供大家参考,具体内容如下 项目需求:可以本地上传头像,也可以选择拍摄头像上传。 组件: 1、Camera组件:实现 打...
    99+
    2024-04-02
  • Vue实现调用PC端摄像头实时拍照
    Vue之调用PC端摄像头实时拍照,供大家参考,具体内容如下 由于我使用的是点击按钮打开模态框拍照所以在这里吧按钮和模态框代码都粘贴如下。 <!-- 打开模态框按钮--&g...
    99+
    2024-04-02
  • Android如何实现控制摄像头拍照
    这篇文章主要介绍Android如何实现控制摄像头拍照,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用Camera控制手机拍照的步骤如下: 1) 调用Camera的open()方法打开相机。该方法默认打开后...
    99+
    2023-06-29
  • 如何使用HTML5实现超酷摄像头拍照功能
    这篇文章给大家分享的是有关如何使用HTML5实现超酷摄像头拍照功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。WebRTC可能是明年最受关注的HTML5标准了,Mozilla为...
    99+
    2024-04-02
  • opencv+mediapipe如何实现人脸检测及摄像头实时示例
    这篇文章主要为大家展示了“opencv+mediapipe如何实现人脸检测及摄像头实时示例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“opencv+mediapipe如何实现人脸检测及摄像头实...
    99+
    2023-06-22
  • vue调取电脑摄像头实现拍照功能
    本文实例为大家分享了vue调取电脑摄像头实现拍照功能的具体代码,供大家参考,具体内容如下 实现效果图: 拍照前&拍照后(我电脑摄像头挡住的,所以图片是灰色) 1.点击拍照上...
    99+
    2024-04-02
  • python调用摄像头实现拍照功能
    目录 1.介绍 2.系统依赖 (1)OpenCV-Python库 (2)Tkinter库 (3)Pillow库 (4)Time库 3.系统代码 4.效果展示 5.注意事项 1.介绍         这是一个有趣的项目,通过Python程...
    99+
    2023-09-21
    python 开发语言
  • 怎么在Python3中使用OpenCV实现实时摄像头人脸检测
    这篇文章主要介绍怎么在Python3中使用OpenCV实现实时摄像头人脸检测,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!OpenCV 是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面...
    99+
    2023-06-25
  • opencv+mediapipe实现人脸检测及摄像头实时示例
    目录单张人脸关键点检测单张图像人脸检测摄像头实时关键点检测单张人脸关键点检测 定义可视化图像函数 导入三维人脸关键点检测模型 导入可视化函数和可视化样式 读取图像 将图像模型输入,获...
    99+
    2024-04-02
  • 基于python+opencv调用电脑摄像头实现实时人脸眼睛以及微笑识别
    本文教大家调用电脑摄像头进行实时人脸+眼睛识别+微笑识别,供大家参考,具体内容如下 一、调用电脑摄像头进行实时人脸+眼睛识别 # 调用电脑摄像头进行实时人脸+眼睛识别,可直接复制...
    99+
    2024-04-02
  • Java+OpenCV调用摄像头实现拍照功能
    目录环境准备制作主界面整体结构介绍核心代码与知识点讲解JPanel中如何显示摄像头的图像OpenCV调用摄像头使用摄像头拍照完整代码OpenCVUtil.javaImageUtils...
    99+
    2024-04-02
  • Matlab控制电脑摄像实现实时人脸检测和识别详解
    目录一、理论基础二、核心程序三、仿真测试结果一、理论基础 人脸识别过程主要由四个阶段组成:人脸检测、图像预处理、面部特征提取和特征识别。首先系统从视频或者相机中捕获图像,检测并分割出...
    99+
    2024-04-02
  • 如何使用Python实现控制摄像头
    这篇文章主要介绍“如何使用Python实现控制摄像头”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Python实现控制摄像头”文章能帮助大家解决问题。第一部分:环境搭建在使用 Python ...
    99+
    2023-07-05
  • html5如何实现调用摄像头
    小编给大家分享一下html5如何实现调用摄像头,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html是什么html的全称为超文本标记语言,它是一种标记语言,包含了...
    99+
    2023-06-09
  • python实现调用摄像头并拍照发邮箱
    项目地址: https://github.com/flygaga/camera 思路 通过opencv调用摄像头拍照保存图像到本地 用email库构造邮件内容,保存图片以附件形式插入邮件内容 用smtplib库发送...
    99+
    2022-06-02
    python 调用摄像头 python 拍照发邮件 python 摄像头拍照
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作