首页 > 其他分享 >vue3+ts中实现人脸识别拍照上传,要求自动人脸框固定居中,可自动拍照识别,也可手动拍照识别,后端使用百度智能云服务

vue3+ts中实现人脸识别拍照上传,要求自动人脸框固定居中,可自动拍照识别,也可手动拍照识别,后端使用百度智能云服务

时间:2024-10-10 13:51:05浏览次数:11  
标签:拍照 const canvas value 自动 context video 识别 faceapi

效果图
在这里插入图片描述

使用技术
face-api.js,canvas
1、npm安装face-api.js

npm install face-api.js

2、下载face-api.js的models
下载models
放在\public\models目录
3、创建face.vue组件

<template>
	<div style="height: calc(100vh - 140px); display: flex; justify-content: center; align-items: center; flex-direction: column">
		<div style="position: relative; z-index: 100">
			<video ref="video" autoplay muted playsinline width="720" height="560"></video>
			<canvas ref="canvas" width="720" height="560"></canvas>
			<el-button type="primary" size="default" @click="takePhoto" style="position: absolute; top: 170px; left: 50%; transform: translateX(-50%)">拍照</el-button>
		</div>
	</div>
</template>

<script setup>
import { onMounted, ref, onBeforeUnmount } from 'vue';
import * as faceapi from 'face-api.js';
import { facialRecognitionUserAdd, groupAdd, userAddFile, detectUploadFile, SearchFacialRecognition } from '/@/api/facial/facialRecognition';
import { ElMessage } from 'element-plus';
import { useUserInfo } from '/@/stores/userInfo';
import { storeToRefs } from 'pinia';

const stores = useUserInfo();
const { userInfos } = storeToRefs(stores);
const video = ref(null);
const canvas = ref(null);
let photoInterval = null;
let intervalId=null;
const startVideo = async () => {
	try {
		const stream = await navigator.mediaDevices.getUserMedia({ video: {} });
		video.value.srcObject = stream;
	} catch (err) {
		console.error('Error accessing webcam:', err);
	}
};

const loadModels = async () => {
	const MODEL_URL = '/models';
	await faceapi.nets.tinyFaceDetector.loadFromUri(MODEL_URL);
	await faceapi.nets.faceLandmark68Net.loadFromUri(MODEL_URL);
	await faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL);
	await faceapi.nets.faceExpressionNet.loadFromUri(MODEL_URL);
};

const drawDetectionsWithStyle = (canvas, detections) => {
	const context = canvas.getContext('2d');
	const rectWidth = 250; // 固定宽度
	const rectHeight = 300; // 固定高度
	const x = (canvas.width - rectWidth) / 2;
	const y = (canvas.height - rectHeight) / 2;

	// 绘制视频到 canvas
	context.drawImage(video.value, 0, 0, canvas.width, canvas.height);

	// 绘制黑色遮罩
	context.fillStyle = 'rgba(0, 0, 0, 0.7)'; // 半透明黑色
	context.fillRect(0, 0, canvas.width, canvas.height);

	// 清除矩形框内的遮罩
	context.clearRect(x, y, rectWidth, rectHeight);

	// 绘制固定位置的矩形框
	context.strokeStyle = 'rgba(0, 255, 255, 0.8)';
	context.lineWidth = 2;
	context.strokeRect(x, y, rectWidth, rectHeight);

	// 调整人脸检测结果的位置
	const displaySize = { width: canvas.width, height: canvas.height };
	const resizedDetections = faceapi.resizeResults(detections, displaySize);

	// 绘制人脸轮廓
	faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);
	faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
};

const detectFaces = async () => {
	const detections = await faceapi.detectAllFaces(video.value, new faceapi.TinyFaceDetectorOptions()).withFaceLandmarks().withFaceExpressions();
	const context = canvas.value.getContext('2d');
	context.clearRect(0, 0, canvas.value.width, canvas.value.height);

	// 使用自定义的绘制函数
	drawDetectionsWithStyle(canvas.value, detections);
};
const takePhoto = async () => {
	const context = canvas.value.getContext('2d');
	context.drawImage(video.value, 0, 0, canvas.value.width, canvas.value.height);
	const imgData = canvas.value.toDataURL('image/jpeg');
	// 以下为调用接口代码,imgData是base64格式数据,按需修改
	const base64Data = imgData.split(',')[1];
	const params = {
		image: base64Data,
		imageType: 'BASE64',
		groupId: userInfos.value.tenantId,
	};
	const res = await “你的接口”(params);
	//按照你的逻辑修改判断条件
	if (res.data.result.result != null) {
		if (res.data.result.result.user_list[0].user_id == userInfos.value.faceId) {
			ElMessage.success('签到成功');
			stopVideo();
			emit('closeSignIn');
		} else {
			ElMessage.error('识别失败,请本人操作!');
		}
	} else {
		ElMessage.error(res.data.result.error_msg);

		// console.log('识别失败,继续尝试');
	}
};
const emit = defineEmits(['closeSignIn']);
const stopVideo = () => {
	// 停止视频流
	if (video.value && video.value.srcObject) {
		const stream = video.value.srcObject;
		const tracks = stream.getTracks();
		tracks.forEach((track) => track.stop());
		video.value.srcObject = null;
	}
	if (intervalId) {
		clearInterval(intervalId);
		intervalId = null;
	}
	// 自动拍照
	// if (photoInterval) {
	// 	clearInterval(photoInterval);
	// 	photoInterval = null;
	// }
};
onMounted(async () => {
	await loadModels();
	await startVideo();
	video.value.addEventListener('play', () => {
		intervalId=setInterval(detectFaces, 200);
	});
	// 自动拍照
	// setTimeout(() => {
	//     photoInterval = setInterval(takePhoto, 1000);
	//   }, 3000);
});
// 关闭定时器
onBeforeUnmount(() => {
	stopVideo();
});
</script>

<style scoped>
video,
canvas {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}
</style>


4、在需要使用的地方引入即可
5、此为vue3+ts用法,人脸框各种样式可以根据自己的需求修改。原帖地址 原贴vue2实现方式

标签:拍照,const,canvas,value,自动,context,video,识别,faceapi
From: https://blog.csdn.net/fengyanwangwujin/article/details/142788833

相关文章

  • 在K8S中,自动扩容机制是什么?
    在Kubernetes(K8s)中,自动扩容机制是一项关键功能,它根据应用程序的负载情况动态地调整集群中Pod的数量,以确保服务的稳定性和高效性。以下是对K8s自动扩容机制的详细解释:1.定义与目的自动扩容机制通过监控Pod的资源使用情况,如CPU使用率、内存使用率等,当这些资源的使用超过预设的阈......
  • 基于SSM的OA自动化办公系统【附源码+文档】
    ......
  • 实时显示和拍照存储,IFD-x让你实时掌握温度信息 非接触式热成像仪器红外线成像
    实时显示和拍照存储,IFD-x让你实时掌握温度信息非接触式热成像仪器红外线成像非接触式热成像仪器,IFD-x采用红外阵列高精度温度传感器和先进的软件算法。它能够对视场范围内的任何物体进行红外成像,成像分辨率达到512*384像素,温度灵敏度为0.1℃,绝对精度为±1.5℃,刷新频率最高可达......
  • uibot发送邮件:自动化邮件发送教程详解!
    uibot发送邮件的操作指南?uibot发送邮件的两种方式?在现代办公环境中,自动化流程的引入极大地提高了工作效率。uibot发送邮件功能成为了许多企业和个人实现邮件自动化发送的首选工具。AokSend将详细介绍如何使用uibot发送邮件。uibot发送邮件:准备工作确保您已经安装并配置好了......
  • 关于set实现结构体自动去重原理的推论
    转自本人博客,原文链接先说结论在每个操作均为log复杂度的前提下,set无法在判断顺序和重复关键字不同时完成对结构体元素的去重。  首先我们先看这段结构体定义,目的是先按num相等进行去重,再按key降序排列。structnode{intnum;intkey;booloperator<(con......
  • 人员跌倒检测识别预警系统
    人员跌倒检测识别预警系统利用摄像头和视频AI智能分析技术,人员跌倒检测识别预警系统实时监测老人的活动状态,系统通过图像识别和行为分析算法,对老人的姿态、步态等进行检测和识别。人员跌倒检测识别预警系统一旦系统检测到跌倒事件,立即发出预警信号,并通知相关人员前往提供援助。人......
  • 工地扬尘自动监测识别系统
    工地扬尘自动监测识别系统能够实时监测工地扬尘情况,工地扬尘自动监测识别系统通过在工地布设摄像头,系统能够全天候、全方位地观测扬尘情况。工地扬尘自动监测识别系统监测结果将通过云端平台进行上传和分析,及时反馈给相关管理部门和施工方。这使得工地扬尘问题能够得到快速响应,并......
  • 捕鱼船识别检测预警系统
    捕鱼船识别检测预警系统通过图像识别和数据分析技术,捕鱼船识别检测预警系统实时监测水域中的捕鱼船活动,系统利用河道两岸的摄像头,对捕鱼船的外形、大小、航行轨迹等进行检测和识别。捕鱼船识别检测预警系统一旦系统识别到违规捕捞行为,立即发出预警信号,并通知相关部门采取必要的措......
  • 加油站抽烟烟火智能识别系统
    加油站抽烟烟火智能识别系统利用摄像头和智能分析技术,加油站抽烟烟火智能识别系统实时监测加油站内的加油人员行为,加油站抽烟烟火智能识别系统通过图像识别和行为分析,识别出抽烟和燃放烟火的情况,并发出预警信号以提醒相关人员。加油站抽烟烟火智能识别系统能够实时监测加油站内的......
  • 河道水位自动监测预警系统
    河道水位自动监测预警系统基于AI视频智能水尺读数技术,河道水位自动监测预警系统通过在河道周边布设监控摄像头,实时监测水位的变化。河道水位自动监测预警系统利用人工智能视觉分析技术,进行水位趋势分析和预测。一旦水位超过预设阈值,河道水位自动监测预警系统将自动发出预警信号,并......