吗咿呀嘿-用js来搞个简单的人脸识别

news2025/2/28 23:17:23

在这里插入图片描述
缘起
“蚂蚁呀嘿,蚂蚁呀呼,蚂蚁呀哈” 相信最近好多人的朋友圈或者抖音都被类似视频刷过屏!
类似的效果最早是在2020年初,那个时候大家应该还都记得,几乎所有的人都因为疫情原因被迫线上办公!
工作当然离不开开会了,这点歪果仁和中国很像,国内我们一般用qq或者钉钉来个在线视频会议!歪果仁也会经常开线上会议,不过他们用的最多的是zoom这个软件。经常的在线会会让人很烦躁,为什么呢?原本在家办公就不用洗头了,但是为了开在线视频会议还得去专门洗个头!
so,一个来自俄罗斯程序猿就想了一个招数恶搞一下他的同事。他基于 first-order-model 做了一个叫做Avatarify 的软件,并且放在了全世界做大的同性交友网站github上。First Order Motion Model for Image Animation 简单来说就是把一张图片变成动态的。Avatarify ,看起来很熟悉的名字,你肯定听过一部叫阿凡达的电影!之后程序猿小哥又基于Avatarify 做了一个苹果app,在网上掀起了吗咿呀嘿旋风,不过在上架appstore7天后在中国区就被下架了,原因不得而知。
来看一下 First Order Motion Model上的图片动画结果
在这里插入图片描述
First Order Motion Model上的swap face结果在这里插入图片描述
看完以后大概能明白为什么被下架了!如果东西能被普通人随便使用,那么我们的表情甚至动作都能被别人模拟出来,只要他有一张你的照片!所以说人脸识别不是绝对安全,什么都可以被模拟!这两天的315晚会不知道大家看没有看,好多商家都在非法收集的脸部信息!
上面我们提到的库都是python的,app实现这样的功能都是把图片或者视频传输给服务器,然后服务器处理文件。
浏览器环境人脸识别
我们今天要在浏览器环境下面实现一个简单的人脸识别,我们会用到Tracking.js ,这是一个独立的JavaScript库,用于跟踪从相机或者图片实时收到的数据。跟踪的数据既可以是颜色,也可以是人,也就是说我们可以通过检测到某特定颜色,或者检测一个人体/脸的出现与移动,来触发JavaScript 事件。
trankingjs下载
我们需要先点击后面的标签下载trankingjs在这里插入图片描述
trankingjs使用-识别图片
引入 tracking-min.js人脸识别库
引入face-min.js,eye-min.js,mouth-min.js 脸部,眼睛,嘴巴等模型文件
创建html文件,内容如下

<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./build/tracking-min.js"></script>
  <script src="./build/data/face-min.js"></script>
  <script src="./build/data/mouth-min.js"></script>
  <script src="./build/data/eye-min.js"></script>
  <style>
    .rect {
      border: 2px solid #a64ceb;
      left: -1000px;
      position: absolute;
      top: -1000px;
    }.demo-container {
      width: 100%;
      height: 530px;
      position: relative;
      background: #eee;
      overflow: hidden;
      border-bottom-right-radius: 10px;
      border-bottom-left-radius: 10px;
    }</style>
</head><body>
  <div class="demo-container">
    <img src="./imgs/2.png" alt="" id="img">
  </div><script>
    window.onload = function () {
​
      var tracker = new tracking.ObjectTracker(['face', 'eye', 'mouth']);
      tracker.setStepSize(1.7);
      tracking.track('#img', tracker);
      tracker.on('track', function (event) {
        // 获取跟踪数据
        event.data.forEach(function (rect) {
​
          window.plot(rect.x, rect.y, rect.width, rect.height);
        });
      });
​
      window.plot = function (x, y, w, h) {
        var rect = document.createElement('div');
        document.querySelector('.demo-container').appendChild(rect);
        rect.classList.add('rect');
        rect.style.width = w + 'px';
        rect.style.height = h + 'px';
        rect.style.left = (img.offsetLeft + x) + 'px';
        rect.style.top = (img.offsetTop + y) + 'px';
      };
    }</script></body></html>

html和css比较简单,这里我们主要来看js代码。
注意js代码必须一定要写在window.onload 回调函数里面,否者获取不到图片的数据,就没有办法对图片进行识别!
创建识别对象

      // 创建追踪识别对象
      var tracker = new tracking.ObjectTracker(['face', 'eye', 'mouth']);
      // 设置 追踪识别的图片
      tracking.track('#img', tracker);
      // 监听追踪事件
      tracker.on('track', function (event) {
        // 获取追踪数据
        event.data.forEach(function (rect) {
          window.plot(rect.x, rect.y, rect.width, rect.height);
        });
      });

获取的event.data是一个数组 ,数组存放识别处理出来的脸部数据,数据结构如下
{width: 61, height: 61, x: 244, y: 125}
x和y是识别出来元素的坐标,width和height是识别出来元素的宽度
处理识别结果
接下来我们只要需要把得到的结果标记到图片的对应的位置即可,通过plot函数创建一个div,给定对应的坐标和宽高

   window.plot = function (x, y, w, h) {
        
        var img = document.querySelector('#img')
        var rect = document.createElement('div');
        document.querySelector('.demo-container').appendChild(rect);
        rect.classList.add('rect');
        rect.style.width = w + 'px';
        rect.style.height = h + 'px';
        rect.style.left = (img.offsetLeft + x) + 'px';
        rect.style.top = (img.offsetTop + y) + 'px';
      };

然后就会看到这样的结果,会识别出照片的眼睛、鼻子、嘴巴在这里插入图片描述
trankingjs使用-识别摄像头数据
创建html文件,写入如下代码

<!doctype html>
<html><head>
  <meta charset="utf-8">
  <title>demo</title><script src="./build/tracking-min.js"></script>
  <script src="./build/data/face-min.js"></script>
  <style>
    video,
    canvas {
      position: absolute;
    }</style>
</head><body><div class="demo-container">
    <video id="video" width="320" height="240" preload autoplay loop muted></video>
    <canvas id="canvas" width="320" height="240"></canvas>
  </div><script>
    window.onload = function () {
      // 视频显示
      var video = document.getElementById('video');
      //   绘图
      var canvas = document.getElementById('canvas');
      var context = canvas.getContext('2d');
​
      var tracker = new tracking.ObjectTracker('face');
      //   设置识别的放大比例
      tracker.setInitialScale(4);
      //   设置步长
      tracker.setStepSize(2);
      //   边缘密度
      tracker.setEdgesDensity(0.1);//   启动摄像头,并且识别视频内容
      tracking.track('#video', tracker, {
        camera: true
      });
​
      tracker.on('track', function (event) {
        context.clearRect(0, 0, canvas.width, canvas.height);
        // 绘制
        event.data.forEach(function (rect) {
          context.strokeStyle = '#a64ceb';
          context.strokeRect(rect.x, rect.y, rect.width, rect.height);
        });
      });
​
​
    };</script></body></html>

核心js代码解释如下
创建识别对象
创建识别对象并且启用摄像头,将摄像头内容输出到video标签上


      // 视频显示
      var video = document.getElementById('video');
      
      //创建识别对象
      var tracker = new tracking.ObjectTracker('face');
      //   设置识别的放大比例
      tracker.setInitialScale(4);
      //   设置步长
      tracker.setStepSize(2);
      //   边缘密度
      tracker.setEdgesDensity(0.1);
      //   启动摄像头,并且识别视频内容
      tracking.track('#video', tracker, {
        camera: true
      });

注意:这里的识别放大比例,步长,边缘密度等值可以根据摄像头距离物体远近自己调整。
处理识别结果

      // 创建canvas 用于绘图绘图
      var canvas = document.getElementById('canvas');
      var context = canvas.getContext('2d');
      //监听识别事件
      tracker.on('track', function (event) {
        //清除上一次绘图结果
        context.clearRect(0, 0, canvas.width, canvas.height);
        // 根据识别结果绘制绘制矩形
        event.data.forEach(function (rect) {
          context.strokeStyle = '#a64ceb';
          context.strokeRect(rect.x, rect.y, rect.width, rect.height);
        });
      });

然后启动起来,浏览器会提示是否允许开启摄像头!点击允许,就会看到你英俊潇洒(沉鱼落雁)的脸庞!

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

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

相关文章

mybatisPlus

第十一章&#xff1a;Mybatis_plus 第1节&#xff1a;简介 本章节主要介绍mybatisPlus是mybatis的增强工具&#xff0c;只做增强不做改变&#xff0c;不会对mybatis产生任何影响。它的主要优势具有无侵入、损耗小、强大的CRUD操作、支持 Lambda 形式调用、支持 ActiveRecord模…

向毕业妥协系列之机器学习笔记:无监督学习-异常检测

目录 一.发现异常事件 二.高斯正态分布 三.异常检测算法 四.开发与评估异常检测系统 五.异常检测与监督学习对比 六.选择使用什么特征 一.发现异常事件 下图的例子是飞机发动机的制造&#xff0c;有很多特征&#xff0c;我们为了方便讲解取其中的两个特征&#xff1a;发…

基于JavaWeb的小区物业管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

(1)paddle---在anaconda中安装paddle环境

1、 创建一个anaconda的环境 (1)创建 conda create --name chenpaddle_cp310 python=3.10 如果要删除 conda remove -n chenpaddle_cp310 --all (2)查看现有环境 conda env list #查看现有环境 2、安装 paddlepaddle (1)查看自己安装的cuda版本 nvidia-smi 发现…

java计算机毕业设计ssm+vue工商学院办公用品管理信息系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

Linux内存管理知识总结(一)

以下源代码来自 linux-5.10.3 内核代码&#xff0c;主要以 x86-32 为例 Linux 内存管理是一个很复杂的“工程”&#xff0c;它不仅仅是对物理内存的管理&#xff0c;也涉及到虚拟内存管理、内存交换和内存回收等 物理内存的探测 Linux 内核通过 detect_memory()函数实现对物…

2021年认证杯SPSSPRO杯数学建模B题(第一阶段)依巴谷星表中的毕星团求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 B题 依巴谷星表中的毕星团 原题再现&#xff1a; 依巴谷卫星&#xff08;High Precision Parallax Collecting Satellite&#xff0c;缩写为 Hip-parcos&#xff09;&#xff0c;全称为“依巴谷高精度视差测量卫星”&#xff0c;是欧洲空间局发…

Java培训:重试实现高可用方案

1、背景介绍 随着互联网的发展项目中的业务功能越来越复杂&#xff0c;有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素。在测试阶段可能没有什么异常情况&#xff0c;但上…

Kubernetes存储机制认识

前言&#xff1a; 在Kubernetes系统中&#xff0c;将对容器应用所需的存储资源抽象为存储卷&#xff08;Volume&#xff09;。Volume是与Pod绑定的&#xff08;独立于容器&#xff09;与Pod具有相同生命周期的资源对象。 可以将Volume的内容理解为目录或文件&#xff0c;容器…

Sqoop Hook

环境: ambari大数据平台 sqoop版本1.4.7 hive版本3.1.0 Atlas版本2.2.0 Atlas使用官网给的sqoop hook 具体安装步骤 1、官网安装步骤:https://atlas.apache.org/#/HookSqoop 2、其他安装步骤:https://www.freesion.com/article/45701353391/ 根据以上两个安装的步骤可以解决…

Oracle LiveLabs实验:Automatic Partitioning in Autonomous Database

概述 此实验申请地址在这里。 实验帮助在这里。 此实验预估完成时间100分钟。 关于自治数据库自动分区的帮助文档&#xff0c;请参见这里。 这个实验设计得很好&#xff0c;推荐。 介绍 关于本研讨会 自治数据库中的自动分区分析您的应用程序工作负载&#xff0c;并自动…

使用Ubuntu演示介绍,Linux下安装和配置Redis、配置远程连接redis(保姆级教学)

安装redis 1、先在官网下载好Redis的安装包 Redis 官网&#xff1a;https://redis.io/ Redis 在线测试&#xff1a;http://try.redis.io/ Redis菜鸟教程&#xff1a; https://www.runoob.com/redis/redis-tutorial.html 2、把下载好的安装包放在Ubantu的共享文件夹下 3、Linu…

电商行业少不了的营销方式——邮件营销

邮件营销可以贯穿到客户购买商品的整个流程中&#xff0c;帮助企业以低成本的引流方式获取较高的销售额。邮件营销不同于其他营销方式&#xff0c;如果你获取了客户的邮件信息&#xff0c;可以和客户保持长期的联系&#xff0c;为品牌积累一定的客户资源。这种方式除了能够提升…

Ubuntu20.04.4 LTS正确安装方案及问题解决

Ubuntu20.04.4 LTS报错解决方案1. 开启系统功能支持2. 升级wsl3. 重新打开Ubuntu,输入用户名和密码完成安装4. 其它报错参考1. 开启系统功能支持 打开搜索,输入功能,进入启用或关闭Windows功能 开启适用于Linux的Windows子系统与虚拟机平台 注意: 这两个都得开, 不然会报错 …

MySQL索引理解

目录 什么是索引? 索引的好处 思考一个小问题, 索引这么好, 那是不是越多越好? 索引分类 索引的创建和删除 explain字段解释 索引底层数据结构 区分MyISAM和InnoDB存储引擎来再认知聚簇非聚簇索引 什么是索引? 索引: 类似于目录的帮助快速检索数据的一种数据结构. 辅…

Dragonfly 中 P2P 传输协议优化

文&#xff5c;孙珩珂 上海交通大学 本文1987字 阅读 10 分钟 01 优化背景 此前 Dragonfly 的 P2P 下载采用静态限流策略&#xff0c;相关配置项在 dfget.yaml 配置文件中&#xff1a; # 下载服务选项。 download: # 总下载限速。 totalRateLimit: 1024Mi # 单个任务…

Java-IO流学习

文章目录前言1.Java-IO流简介2.流的基本概念3.创建文件的三种方式3.1根据一个文件路径直接创建一个文件。3.2 根据父目录 File 对象&#xff0c;在子路径创建一个文件3.3 根据父目录路径&#xff0c;在子路径下生成文件4.获取文件信息5.目录与文件操作5.1文件删除5.2目录删除5.…

【Linux】实验二 Makefile 的编写及应用

静态和动态库的转换可以参考这篇文章哦&#xff01;&#xff01; 文章目录实验二 Makefile 的编写及应用实验目的实验内容具体步骤&#xff1a;一、进入文件夹二、生成各个.c .h文件1. exam.h2. exam.c3. mat.h4. mat.c5. main.c三、编译建立的文件1. 只编译不链接 main.o2. 使…

Vue实现任意内容展开 / 收起功能组件

博主介绍 &#x1f4e2;点击下列内容可跳转对应的界面&#xff0c;查看更多精彩内容&#xff01; &#x1f34e;主页&#xff1a;水香木鱼 &#x1f34d;专栏&#xff1a;后台管理系统 文章目录 简介&#xff1a;这是一篇有关【Vue实现任意内容展开 / 收起功能组件】的文章&am…

1.jdk,数据类型,运算符

Java语言跨平台性的解释 一次编译&#xff0c;到处运行 将.java文件编译成.class文件&#xff0c;然后就可以在linux&#xff0c;windows运行。 java的跨平台的实现是通过在不同的操作系统上的不同的jvm差异来实现跨平台的 jdk jdk jre&#xff08;jvmjavase核心类库&…