纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js

        $(function(){//执行开始的方法//showpos = true;startTrack();})var showpos = false;// Put event listeners into place//window.addEventListener("DOMContentLoaded", function() {// Grab elements, create settings, etc.var canvas = document.getElementById("canvas"),context = canvas.getContext("2d"),video = document.getElementById("video"),videoObj = {"video": true},errBack = function(error) {if(error.PERMISSION_DENIED) {jAlert('用户拒绝了浏览器请求媒体的权限', '提示');} else if(error.NOT_SUPPORTED_ERROR) {jAlert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');} else if(error.MANDATORY_UNSATISFIED_ERROR) {jAlert('指定的媒体类型未接收到媒体流', '提示');} else {jAlert('系统未能获取到摄像头,请确保摄像头已正确安装。或尝试刷新页面,重试', '提示');}};// Put video listeners into placeif(navigator.getUserMedia) { // Standardnavigator.getUserMedia(videoObj, function(stream) {video.src = stream;video.play();}, errBack);} else if(navigator.webkitGetUserMedia) { // WebKit-prefixedtry {navigator.webkitGetUserMedia(videoObj, function(stream) {video.src = window.webkitURL.createObjectURL(stream);video.play();}, errBack);} catch(error) {alert(error);}} else if(navigator.mozGetUserMedia) { // Firefox-prefixednavigator.mozGetUserMedia(videoObj, function(stream) {video.src = window.URL.createObjectURL(stream);video.play();}, errBack);}//张嘴document.getElementById("mouse").addEventListener("click", function() {var audio = document.createElement('audio');var source = document.createElement('source');source.type = "audio/mp3";source.src = "mp3/alive_mouse.mp3";source.autoplay = "autoplay";source.controls = "controls";audio.appendChild(source);audio.play();alive_mouse();});//摇头document.getElementById("head").addEventListener("click", function() {alive_head();});//眨眨眼document.getElementById("eye").addEventListener("click", function() {var audio = document.createElement('audio');var source = document.createElement('source');source.type = "audio/mp3";source.src = "mp3/alive_eye.mp3";source.autoplay = "autoplay";source.controls = "controls";audio.appendChild(source);audio.play();alive_eye();});//}, false);////////////////////////////////////////////////////////////////////////////////活体var last_time = 0; //时间因素var last_nose_left = 0;var last_nose_top = 0;//张嘴动作var is_mouse_ok = false;var is_alive_mouse = false;var last_dis_eye_norse = 0;var last_dis_mouse = 0;//检测张嘴动作function alive_mouse() {document.getElementById("tip").innerHTML = "请张合嘴巴";document.getElementById('result').value = "";is_mouse_ok = false;last_dis_mouse = 0;last_time = 0;last_dis_eye_norse = 100000000;is_alive_head = false;is_alive_mouse = true;is_alive_eye = false;}//摇头动作var is_head_ok = false;var is_alive_head = false;var last_dis_left_right = 100000000;function alive_head() {document.getElementById("tip").innerHTML = "请在水平方向左右摇头";document.getElementById('result').value = "";is_head_ok = false;last_dis_left_right = 100000000;last_time = 0;is_alive_head = true;is_alive_mouse = false;is_alive_eye = false;}//眨眼动作var is_alive_eye = false;var is_eye_ok = false;function alive_eye() {document.getElementById("tip").innerHTML = "请眨眼";document.getElementById('result').value = "";is_eye_ok = false;last_dis_eye_norse = 100000000;last_nose_left = 0;last_nose_top = 0;last_time = 0;is_alive_head = false;is_alive_mouse = false;is_alive_eye = true;}function startTrack() {var videoInput = document.getElementById('video');var ctracker = new clm.tracker();ctracker.init(pModel);ctracker.start(videoInput);var canvasInput = document.getElementById('canvas');var cc = canvasInput.getContext('2d');cc.lineWidth = 3;function drawLoop() {//requestAnimationFrame(drawLoop);cc.clearRect(0, 0, canvasInput.width, canvasInput.height);//ctracker.draw(canvasInput );var positions = ctracker.getCurrentPosition();if(showpos && positions) {for(var p = 0; p < positions.length; p++) {positionString += "featurepoint " + p + " : [" + positions[p][0].toFixed(2) + "," + positions[p][1].toFixed(2) + "]<br/>";}document.getElementById('positions').innerHTML = positionString;}if(positions) {for(var p = 0; p < 71; p++) {cc.beginPath();cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);cc.closePath();cc.fillStyle = '#00FF00';cc.fill();}//cc.strokeStyle = 'red';//0-14 轮廓//7 下吧,最下//2 最左边//12 最右边//15-22 眉毛//23-27 左眼睛五个点//27 左眼中间//63-66 左眼四个点//28-32 右眼睛五个点//67-70 右眼四个点//33-43 鼻子//62 鼻中间//44-61 嘴巴//47 嘴巴上//53 嘴巴下/////////////////////////////////////////////////////////////////////////////////////////////////左眼中间for(var p = 27; p <= 27; p++) {cc.beginPath();cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);cc.closePath();cc.fillStyle = 'red';cc.fill();}//鼻子中间for(var p = 62; p <= 62; p++) {cc.beginPath();cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);cc.closePath();cc.fillStyle = 'red';cc.fill();}//嘴巴上for(var p = 57; p <= 57; p++) {cc.beginPath();cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);cc.closePath();cc.fillStyle = 'red';cc.fill();}//嘴巴下for(var p = 60; p <= 60; p++) {cc.beginPath();cc.arc(positions[p][0].toFixed(2), positions[p][1].toFixed(2), 2, 0, Math.PI * 2, true);cc.closePath();cc.fillStyle = 'red';cc.fill();}////////////////////////////////////////headif(is_alive_head == true) {if(last_time == 0 || (new Date().getTime() - last_time > 500 && new Date().getTime() - last_time < 10000)) {var xdiff_left = positions[62][0] - positions[2][0];var ydiff_left = positions[62][1] - positions[2][1];var dis_left = Math.pow((xdiff_left * xdiff_left + ydiff_left * ydiff_left), 0.5);var xdiff_right = positions[12][0] - positions[62][0];var ydiff_right = positions[12][1] - positions[62][1];var dis_right = Math.pow((xdiff_right * xdiff_right + ydiff_right * ydiff_right), 0.5);var xdiff_side = positions[12][0] - positions[2][0];var ydiff_side = positions[12][1] - positions[2][1];var dis_side = Math.pow((xdiff_side * xdiff_side + ydiff_side * ydiff_side), 0.5);var dis_left_right = dis_left - dis_right;document.getElementById('result').value = dis_left_right;if(last_dis_left_right > 0 && dis_left_right > dis_side / 3) {document.getElementById('result').value = "通过";var msg_m =document.getElementById('result'); if(msg_m.value=='通过'){//执行其他方法is_head_ok = true;is_alive_head = false;location.href="http://muxiongxiong.top"}}last_dis_left_right = dis_left_right;last_time = new Date().getTime();}}///////////////////////////////////////mouse if(is_alive_mouse == true) {if(last_time == 0 || (new Date().getTime() - last_time > 500 && new Date().getTime() - last_time < 10000)) {//研究和鼻子距离var xdiff = positions[62][0] - positions[27][0];var ydiff = positions[62][1] - positions[27][1];var dis_eye_norse = Math.pow((xdiff * xdiff + ydiff * ydiff), 0.5);//上嘴唇 和下嘴唇距离var xdiff_mouse = positions[53][0] - positions[47][0];var ydiff_mouse = positions[53][1] - positions[47][1];var dis_mouse = Math.pow((xdiff_mouse * xdiff_mouse + ydiff_mouse * ydiff_mouse), 0.5);//上次的眼鼻距离和这次的眼鼻距离差var dn = Math.abs(dis_eye_norse - last_dis_eye_norse);//上次的嘴距离和本次的嘴距离差var dm = Math.abs(dis_mouse - last_dis_mouse);//鼻子的位置确保变化不大if(last_nose_left > 0 && last_nose_top > 0 &&Math.abs(positions[62][0] - last_nose_left) < 5 &&Math.abs(positions[62][1] - last_nose_top) < 5) {document.getElementById('msg').innerHTML = dn;if(last_dis_eye_norse > 0 && dn < dis_eye_norse * 1 / 50) {if(last_dis_mouse > 0 && dm > dis_mouse / 10) {document.getElementById('result').value = "通过";var msg_mouse = document.getElementById('result');if(msg_mouse.value=='通过'){//验证摇头is_alive_mouse = false;is_mouse_ok = true;var audio = document.createElement('audio');var source = document.createElement('source');source.type = "audio/mp3";source.src = "mp3/alive_head.mp3";source.autoplay = "autoplay";source.controls = "controls";audio.appendChild(source);audio.play();alive_head();}}}}last_dis_mouse = dis_mouse;last_dis_eye_norse = dis_eye_norse;last_time = new Date().getTime();last_nose_left = positions[62][0];last_nose_top = positions[62][1];}}///////////////////////////////////////eye if(is_alive_eye == true) {if(last_time == 0 || (new Date().getTime() - last_time > 10)) {var xdiff1 = positions[62][0] - positions[27][0];var ydiff1 = positions[62][1] - positions[27][1];var dis_eye_norse1 = Math.pow((xdiff1 * xdiff1 + ydiff1 * ydiff1), 0.5);var xdiff2 = positions[62][0] - positions[32][0];var ydiff2 = positions[62][1] - positions[32][1];var dis_eye_norse2 = Math.pow((xdiff2 * xdiff2 + ydiff2 * ydiff2), 0.5);var dis_eye_norse = (dis_eye_norse1 + dis_eye_norse2);if(last_nose_left > 0 && last_nose_top > 0 &&Math.abs(positions[62][0] - last_nose_left) < 0.5 &&Math.abs(positions[62][1] - last_nose_top) < 0.5) {document.getElementById('msg').innerHTML = Math.abs(dis_eye_norse - last_dis_eye_norse) - dis_eye_norse * 1 / 20;if(last_dis_eye_norse > 0 && (Math.abs(dis_eye_norse - last_dis_eye_norse) > dis_eye_norse * 1 / 20)) {document.getElementById('result').value = "通过";is_alive_eye = false;is_eye_ok = true;}}last_nose_left = positions[62][0];last_nose_top = positions[62][1];last_dis_eye_norse = dis_eye_norse;last_time = new Date().getTime();}}}requestAnimationFrame(drawLoop);}drawLoop();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle10g ty_str_split,Oracle split(分隔字符串函数)

一 Oracle版本: 10g PLSQL: 8.0二 具体代码如下:1 类型CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000)2 函数CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_str_splitISj INT : 0;i INT : 1;len INT : 0;len…

数组中一种数出现奇数次和两种数出现奇数次

题目描述 思路分析 代码实现 package class01;/*** 创建人 wdl* 创建时间 2021/4/10* 描述*/ public class num1ornum2 {public static void main(String[] args) {int arr1[]{1,2,2,2,1,3,3};printOddTimesNum1(arr1);int arr2[]{1,2,2,2,1,3,3,5};printOddTimesNum2(arr2);}…

基于微软开发平台构建和使用私有NuGet托管库

本篇blog包含使用TFS2017&#xff0c;VS2017等平台和工具搭建和使用NuGet库等基本过程&#xff0c;为团体提供更加自动化和高效的研发活动支持。 作为以产品线或者以专属业务为扩展的项目类型的软件研发团体&#xff0c;都会有自己的基础软件框架和功能模块的软件产品智力资产库…

MySQL timestampdiff()函数

转载自 MySQL timestampdiff()函数 MySQL TIMESTAMPDIFF函数简介 下面说明了TIMESTAMPDIFF函数的语法。 TIMESTAMPDIFF(unit,begin,end);TIMESTAMPDIFF函数返回begin-end的结果&#xff0c;其中begin和end是DATE或DATETIME表达式。 TIMESTAMPDIFF函数允许其参数具有混合类…

linux挂载多个目录下,linux – 如何在centos上使用nfs4挂载多个文件夹?

我想让nfs4在这里工作.机器1(服务器)我有一个文件夹,其中2个其他文件夹我试图独立分享. / shared / folder1 / shared / folder2问题是,我似乎无法弄清楚如何在客户端上独立挂载文件夹.(机器1 – 服务器)/ etc / exports中&#xff1a;/var/shared/folder1 192.168.200.101(rw,…

你真的理解CAP理论吗?

最近在学习消息中间件的时候&#xff0c;接触到了分布式系统&#xff0c;进而接触到CAP理论&#xff0c;上一次接触还是在年初的时候公司的技术分享会上&#xff0c;有人在介绍项目的时候简单介绍了这个CAP理论&#xff0c;但并没有深入研究。这次&#xff0c;该是时候研究一下…

264. 丑数 II---LeetCode---JAVA(动态规划)

class Solution { public int nthUglyNumber(int n) {int[] nums new int[n];//初始化数组int index2 0;int index3 0;int index5 0;int tmp 1;nums[0] 1;//初始化第一个值&#xff0c;当n等于1的时候直接是1int cnt 1;while (cnt < n) {tmp Math.min(nums[index2] …

MySQL week()函数

转载自 MySQL week()函数 MySQL WEEK函数介绍 通常&#xff0c;一年的正常年份为365天&#xff0c;闰年为366天。一年又可以分为许多周&#xff0c;每周有7天。 所以一年&#xff0c;我们经常有365/7 52周&#xff0c;周范围是从1到52。 要查看给定日期属于哪个周数&…

老司机实战Windows Server Docker:4 单节点Windows Docker服务器简单运维(下)

上篇中&#xff0c;我们主要介绍了使用docker-compose对Windows Docker单服务器进行远程管理&#xff0c;编译和部署镜像&#xff0c;并且设置容器的自动启动。但是&#xff0c;还有一些重要的问题没有解决&#xff0c;这些问题不解决&#xff0c;就完全谈不上运维&#xff1a;…

linux将光驱挂载到目录下,Linux操作系统下关于光驱的挂载

Linux操作系统下关于光驱的挂载Linux将每一个物理设备都映射成了一个文件&#xff0c;这些文件都放在了/dev文件(linux中目录也是文件)下面&#xff0c;光驱映射成的文件就是一个名为cdrom的文件。mount命令是挂载光驱的基本命令&#xff0c;其后可以跟参数。在挂载光驱之前首先…

2018蓝桥杯省赛---java---C---4( 第几个幸运数)

题目描述 思路分析 直接暴力 代码实现 package TEST;public class Main {public static void main(String[] args) {long n 59084709587505L, cnt 0;for (long a 1; a < n; a * 3)for (long b 1; b < n; b * 5)for (long c 1; c < n; c * 7)if (a * b * c <…

MySQL weekday()函数

转载自 MySQL weekday()函数 WEEKDAY函数返回一个日期的工作日索引值&#xff0c;即星期一为0&#xff0c;星期二为1&#xff0c;星期日为6。 以下说明了WEEKDAY函数的语法&#xff1a; WEEKDAY(date)WEEKDAY函数接受1个参数&#xff0c;即DATE或DATETIME值&#xff0c;它返…

MySQL year()函数

转载自 MySQL year()函数 MySQL YEAR函数简介 YEAR()函数接受date参数&#xff0c;并返回日期的年份。请参阅YEAR()函数的语法&#xff1a; YEAR(date);YEAR()函数返回一个指定日期的年份值&#xff0c;范围为1000到9999&#xff0c;如果日期为零&#xff0c;YEAR()函数返回…

MySQL协议.NET Core实现(一)

一个有技术追求的研发团对&#xff0c;无论使用什么框架、什么工具、什么语言&#xff0c;团队里应该有人有能力把控所使用框架、工具、语言的每一个核心功能的实现细节。团队里的每个成员应该根据自身所长挑选其中一块做深入研究&#xff0c;并把研究成果分享给团队&#xff0…

2018蓝桥杯省赛---java---C---7(缩位求和)

题目描述 问题描述在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。 比如&#xff1a;248 * 15 3720 把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是1位数&#xff0c;得 2 4 8 14 > 1 4 5; 1 …

龙芯linux内核,龙芯的linux kernel,内核开发与编译

在很久很久以前&#xff0c;linux被视为geek极客的玩具。自行升级Linux内核&#xff0c;对普通用户来说&#xff0c;简直是天方夜谭。曾经的曾经&#xff0c;升级内核需要很多纷繁复杂的步骤&#xff0c;也需要花费很多的时间。但是&#xff0c;现在不一样了。内核的安装可以方…

MySQL coalesce()函数

转载自 MySQL coalesce()函数 MySQL COALESCE函数介绍 下面说明了COALESCE函数语法&#xff1a; COALESCE(value1,value2,...);COALESCE函数需要许多参数&#xff0c;并返回第一个非NULL参数。如果所有参数都为NULL&#xff0c;则COALESCE函数返回NULL。 以下显示了使用CO…

2018蓝桥杯省赛---java---C---8(等腰三角形)

题目描述 问题描述本题目要求你在控制台输出一个由数字组成的等腰三角形。 具体的步骤是&#xff1a;先用1,2,3&#xff0c;…的自然数拼一个足够长的串 用这个串填充三角形的三条边。从上方顶点开始&#xff0c;逆时针填充。 比如&#xff0c;当三角形高度是8时&#xff1a;1…

Git,Git Flow,GitLab使用指南

高效利用一次蹲坑时间&#xff0c;看看如何使用Git Flow进行高效开发&#xff0c;什么才是Git提交的正确姿势&#xff0c;怎样使用GitLab进行Code Review&#xff1a; 使用Git Flow高效开发&#xff1b;Git提交正确姿势&#xff0c;Commit message编写指南&#xff1b;使用Git…

arm linux gcc 编译,Linux arm-linux-gcc交叉编译环境配置

Linux下的arm-linux-gcc交叉编译环境安装安装arm-linux-gcc(1) 打开终端&#xff0c;使用sudo命令进入从超级管理员&#xff1a;sudo su输入超级管理员密码。(2) 使用cd命令进入桌面&#xff1a;cd Desktop(3)复制arm-linux-gcc-4.4.3.tar.gz安装包到Ubuntu桌面下面(4)打开终端…