需求:

安卓原生app端接入腾讯人脸核身sdk,采集人脸信息和账号绑定。用户使用同一账号登录微信公众号h5端,h5采集人脸信息,调用腾讯人脸比对接口,和原生app端采集的人脸信息比对,是否是同一个人,然后再进行下一步操作。

H5实现思路:

1.如何调用移动端设备摄像头

2.使用tracking.js捕捉人脸

3.对人脸进行拍照,描绘到canvas画布上面

4.将照片转换成base64格式

5.调用后台接口,后台调用腾讯人脸比对接口进行比对。(由于调用腾讯人脸比对接口需要签名,签名在后台做比较合适)

代码以及注释

1.下载tracking.js 网址:https://trackingjs.com   将需要的js文件复制到静态资源文件夹

静态资源引入

2.使用video标签调用手机摄像头,playsinline、webkit-playsinline属性非常重要,如果不写会掉不起来苹果手机的摄像头。微信开发者文档上面有明确的说明,喜欢钻研的同学可以到微信开发者文档中查看文档。video和canvas的宽高的写法是为了适配手机屏幕的大小。

<template><div id="app"><div v-show="showContainer" class="face-capture" id="face-capture"><p class="tip">请保持人像在取景框内</p><videoid="video":width="vwidth":height="vheight"playsinlinewebkit-playsinline></video><canvas id="refCanvas" :width="cwidth" :height="cheight"></canvas><imgclass="img-cover"src="@/assets/img/face/yuanxingtouming.png"alt=""/><p class="contentp">{{ scanTip }}</p></div><div v-if="!showContainer" class="img-face"><img class="imgurl" :src="imgUrl" /></div></div></template>

3.获取媒体设备,video开始播放

import tracking from "@/assets/js/tracking-min.js";import "@/assets/js/data/face-min.js";import "@/assets/js/data/eye-min.js";import "@/assets/js/data/mouth-min.js";import { faceInfo, conFace } from "@/request/api/my.js";export default {data() {return {screenSize: {width: window.screen.width,height: window.screen.height,},URL: null,streamIns: null, // 视频流showContainer: true, // 显示tracker: null,tipFlag: false, // 提示用户已经检测到flag: false, // 判断是否已经拍照context: null, // canvas上下文profile: [], // 轮廓removePhotoID: null, // 停止转换图片scanTip: "人脸识别中...", // 提示文字imgUrl: "",canvas: null,trackertask: null,vwidth: "266",vheight: "266",cwidth: "266",cheight: "266",userInfo: {},orderData: {},};},mounted() {//设置video canvas宽高const scale = this.screenSize.width / 375;this.vwidth = 266 * scale;this.vheight = 266 * scale;this.cwidth = 266 * scale;this.cheight = 266 * scale;this.playVideo();},methods: {playVideo() {this.getUserMedia({//摄像头拍摄的区域video: {width: 500,height: 500,facingMode: "user",} /* 前置优先 */,},this.success,this.error);},// 访问用户媒体设备getUserMedia(constrains, success, error) {if (navigator.mediaDevices.getUserMedia) {//最新标准APInavigator.mediaDevices.getUserMedia(constrains).then(success).catch(error);} else if (navigator.webkitGetUserMedia) {//webkit内核浏览器navigator.webkitGetUserMedia(constrains).then(success).catch(error);} else if (navigator.mozGetUserMedia) {//Firefox浏览器navagator.mozGetUserMedia(constrains).then(success).catch(error);} else if (navigator.getUserMedia) {//旧版APInavigator.getUserMedia(constrains).then(success).catch(error);} else {this.scanTip = "你的浏览器不支持访问用户媒体设备";}},}

4.安卓手机在允许调用摄像头之后正常调用和播放,苹果手机第一次允许之后调不出来摄像头,返回到上个页面再次进入人脸识别页面,可以正常调用。这个问题想了很多方向,使用了微信api里面的一些监听方法,依然无效。想了一些策略,在前一个页面获取媒体设备等,都不是完美方案。 耽误了两天时间,这天中午午休,我做梦梦到一个美女。那美女竟然穿着女仆装,超短的蕾丝花边裙,修长光溜溜的美腿,洁白秀美的脸蛋,乌黑发亮的发丝,圆润丰满的胸脯,简直是梦想中的女朋友。我对着那个美女抛了一个媚眼,那美女便婀娜多姿地眨着眼睛回应我。我咽了一口口水,忍不住便问:你如何才能做我女朋友。那美女张开樱桃小口,突出几个调皮的字来:你抓到我,我便以身相许。此话一听,我哪能安奈住自己激动的内心。迅速向她扑去,可是我向她跑去,她就转身向后跑,我停下来,她就停下来对我抛飞吻。我追呀追,她跑呀跑,她始终跟我保持着一定的距离,我是怎么都追不上她,气的我吐血。突然,我心想,上次做梦,我得到了一件短暂时间穿越能力。只要我集中精力发功,我就能穿越到未来1秒以后的时间。想到此我就开始集中精力,我一追她便跑,我一停她便停。突然这个世界相对与我静止了1秒钟,我利用这1秒的时间,迅速接近女仆装美女。1秒1秒又1秒,我终于抱住了女仆装美女,那美女对我眉开眼笑,还用樱桃小口往我脸上亲......突然,音乐响起,午休时间结束,我意犹未尽的醒来,发现抱枕上面都是口水,赶快趁人不注意用纸擦掉。又是突然,我想到了是否可以在调用video.play方法的时候,给它加一个定时器,让它1秒钟之后再执行。  没想到加上之后,苹果手机上面的问题解决了。自此,我猜想:当我们询问是否可以调用手机摄像头的时候,苹果的系统弹框阻碍了js的执行,在那一刻js代码停止执行,但是当我们点击允许之后,js代码没有继续执行,因为系统没有手段或者说事件去触发代码继续走。我们加上setTimeout函数之后,系统有了可以让代码继续执行的触发手段,所以js代码继续执行,我们就可以进行下一步人脸捕捉了。如果同学们有更好的解释,欢迎留言。

点击允许

点击允许苹果手机并不掉起摄像头

代码

success(stream) {this.streamIns = stream;const video = document.getElementById("video");// webkit内核浏览器this.URL = window.URL || window.webkitURL;if ("srcObject" in video) {video.srcObject = stream;} else {video.src = this.URL.createObjectURL(stream);}// 苹果手机的系统弹框会阻止js的线程的继续执行 手动0.1秒之后自动执行代码setTimeout(() => {video.play();this.initTracker();// 人脸捕捉}, 100);},error(e) {this.scanTip = "访问用户媒体失败";},

5.设置各种参数 实例化人脸捕捉实例对象

识别中

// 人脸捕捉 设置各种参数 实例化人脸捕捉实例对象,注意canvas上面的动画效果。initTracker() {this.context = document.getElementById("refCanvas").getContext("2d"); // 画布this.canvas = document.getElementById("refCanvas");this.tracker = new window.tracking.ObjectTracker("face"); // tracker实例this.tracker.setInitialScale(4);this.tracker.setStepSize(2); // 设置步长this.tracker.setEdgesDensity(0.1);try {this.trackertask = window.tracking.track("#video", this.tracker); // 开始追踪} catch (e) {this.scanTip = "访问用户媒体失败,请重试";}//开始捕捉方法 一直不停的检测人脸直到检测到人脸this.tracker.on("track", (e) => {//画布描绘之前清空画布this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);if (e.data.length === 0) {this.scanTip = "未检测到人脸";} else {e.data.forEach((rect) => {//设置canvas 方框的颜色大小this.context.strokeStyle = "#42e365";this.context.lineWidth = 2;this.context.strokeRect(rect.x, rect.y, rect.width, rect.height);});if (!this.tipFlag) {this.scanTip = "检测成功,正在拍照,请保持不动2秒";}// 1.5秒后拍照,仅拍一次 给用户一个准备时间// falg 限制一直捕捉人脸,只要拍照之后就停止检测if (!this.flag) {this.scanTip = "拍照中...";this.flag = true;this.removePhotoID = setTimeout(() => {this.tackPhoto();document.getElementById("video").pause();this.tipFlag = true;}, 1500);}}});},

6.拍照 绘制照片,计算照片大小,腾讯人脸比对接口对照片大小和格式有要求。

// 拍照tackPhoto() {// 在画布上面绘制拍到的照片this.context.drawImage(document.getElementById("video"),0,0,this.vwidth,this.vwidth);// 保存为base64格式this.imgUrl = this.saveAsPNG(document.getElementById("refCanvas"));/** 拿到base64格式图片之后就可以在this.compare方法中去调用后端接口比较了,也可以调用getBlobBydataURI方法转化成文件再去比较* 我们项目里有一个设置个人头像的地方,先保存一下用户的图片,然后去拿这个图片的地址和当前拍照图片给后端接口去比较。* */// this.compare(imgUrl)//判断图片大小this.imgSize();this.faceToTengXun(); // 人脸比对this.close();},imgSize() {if (this.imgUrl) {// 获取base64图片byte大小const equalIndex = this.imgUrl.indexOf("="); // 获取=号下标let size;if (equalIndex > 0) {const str = this.imgUrl.substring(0, equalIndex); // 去除=号const strLength = str.length;const fileLength = strLength - (strLength / 8) * 2; // 真实的图片byte大小size = Math.floor(fileLength / 1024); // 向下取整console.log("size", size + "KB");} else {const strLength = this.imgUrl.length;const fileLength = strLength - (strLength / 8) * 2;size = Math.floor(fileLength / 1024); // 向下取整console.log("size", size + "KB");}if (size > 1024) {// 图片超过1M 按比例压缩this.imgUrl = document.getElementById("refCanvas").toDataURL("image/png", 1024 / size);}}},// Base64转文件getBlobBydataURI(dataURI, type) {var binary = window.atob(dataURI.split(",")[1]);var array = [];for (var i = 0; i < binary.length; i++) {array.push(binary.charCodeAt(i));}return new Blob([new Uint8Array(array)], {type: type,});},// compare(url) {//     let blob = this.getBlobBydataURI(url, 'image/png')//     let formData = new FormData()//     formData.append("file", blob, "file_" + Date.parse(new Date()) + ".png")//     // TODO 得到文件后进行人脸识别// },// 保存为png,base64格式图片saveAsPNG(c) {return c.toDataURL("image/png", 0.4);},

7. 人脸采集之后,移除实例化对象,初始化参数

close() {this.flag = false;this.tipFlag = false;this.showContainer = false;this.context = null;this.scanTip = "人脸识别中...";clearTimeout(this.removePhotoID);if (this.streamIns) {this.streamIns.enabled = false;this.streamIns.getTracks()[0].stop();this.streamIns.getVideoTracks()[0].stop();}this.streamIns = null;this.trackertask.stop();this.tracker = null;}

css样式部分代码

<style>.face-capture {display: flex;flex-direction: column;align-items: center;justify-content: center;}.tip {position: fixed;top: 48px;z-index: 5;font-size: 18px;font-family: PingFangSC-Medium, PingFang SC;font-weight: 500;color: #333333;line-height: 25px;}.face-capture video,.face-capture canvas {position: fixed;top: 117.5px;object-fit: cover;z-index: 2;background-repeat: no-repeat;background-size: 100% 100%;}.face-capture .img-cover {position: fixed;top: 63px;width: 375px;height: 375px;object-fit: cover;z-index: 3;background-repeat: no-repeat;background-size: 100% 100%;}.face-capture .contentp {position: fixed;top: 438px;font-size: 18px;font-weight: 500;color: #333333;}.face-capture .rect {border: 2px solid #0aeb08;position: fixed;z-index: 4;}.img-face {display: flex;flex-direction: column;align-items: center;justify-content: center;}.img-face .imgurl {position: fixed;top: 117.5px;width: 266px;height: 266px;border-radius: 133px;}</style>

总结:

1.人脸捕捉技术使用的tracking.js,关键是要理解它的运作原理和一下参数配置。

2.因为要调用手机媒体设备,兼容性问题是大问题,特别是苹果手机的问题,往往不知道如何下手,需要有丰富的开发经验和各种曲线救国的开发思想。

VUE项目-H5端人脸识别功能实现相关推荐

  1. 基于Three.js和MindAR实现的网页端人脸识别功能和仿抖音猫脸特效换脸的各种面罩实现(含源码)

    前言 之前我分享的博客网页端WebAR人脸识别追踪功能的京剧换脸Demo,反响很不错,最近一直也在找一些适合面部的贴图,尝试一些效果.包括了之前在抖音上玩的猫脸特效: 我感觉完全可以通过制作猫脸的贴图 ...

  2. 【转】人脸识别功能的用户体验设计优化

    2016-08-09 人脸识别技术是生物特征识别技术的一种,因其相对其它生物特征识别技术的优点而在市场上得到广泛应用.在人脸识别功能优化设计的项目中,主要以"三步走"的流程完成了设 ...

  3. 微信开放标签<wx-open-launch-app>之Vue项目H5唤醒APP

    微信开放标签<wx-open-launch-app>之Vue项目H5唤醒APP 在微信开放标签出来之前,大多数人都是采用 URI Scheme 以及 ios 的universal Link ...

  4. NDK开发前奏 - 实现支付宝人脸识别功能

    1. 基于 Android Studio 的 opencv 配置与使用 先推荐一本书<计算机视觉 - 算法与应用>,相信用过 OpenCV 的哥们都知道这是用来干啥的,这里我就不再啰嗦.只 ...

  5. Java服务端人脸识别实战开发优化

    最近有合作公司的项目需要服务端人脸识别的开发,于是就用了公司的人脸识别SDK开发,由于之前对服务端开发介绍的资料比较少,正好这次又做了这个项目,花了几天的开发,这里就简单分享一下个人的见解. 影响性能 ...

  6. ACM旗舰期刊最新综述:一览端到端人脸识别最新进展

    ©作者 | 小舟.陈萍 来源 | 机器之心 人脸识别是计算机视觉(CV)领域中最热门和悠久的研究课题之一.本篇综述全面地回顾了端到端深度学习人脸识别系统的三个组成要素,包括人脸检测.人脸对齐和人脸表征 ...

  7. Facebook面向所有用户开放人脸识别功能;福布斯美国最具创新力领袖公布;AMD:将发新BIOS 优化三代锐龙加速性能……...

    戳蓝字"CSDN云计算"关注我们哦! 嗨,大家好,重磅君带来的[云重磅]特别栏目,如期而至,每周五第一时间为大家带来重磅新闻.把握技术风向标,了解行业应用与实践,就交给我重磅君吧! ...

  8. 人脸识别手机端APK分享 | 极速体验人脸识别功能 创建一个简单的人脸识别手机APP程序

    1.前言 虹软公司提供免费离线人脸识别,对于开发者提供了比较友好.完整的可配置demo.但是如需直接体验功能,还是要花一点时间去完成项目编译.配置等一系列工作,对于初学者.不怎么熟悉整个项目的人来说可 ...

  9. 2020最新版Android一步一步教轻松通过ArcSoft虹软平台实现人脸识别功能,保姆级别教程?

    Android实现人脸识别功能 第一步:注册并认证成为开发者. 第二步:创建应用 1.认证成功后,我们就可以开始创建应用. 2,填写信息 3.点击添加SDK 4.选择人脸识别 5.选择情况,如图所示. ...

  10. java人脸识别教程_用 Java 实现人脸识别功能(附源码)

    > 整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 引言 远程在家办公的第N天,快要闲出屁了,今 ...

最新文章

  1. java从入门到入土_Java从入门到入土100天,第四天
  2. SQL語句大全4(常用函數)
  3. 介绍几个移动web app开发框架
  4. 事务内容postgresql pgbench
  5. 分布式ID-数据库多主模式
  6. CRM下午茶(22)-客户关系管理应用现状
  7. java jdbc mysql 乱码_【求助】为什么用纯java jdbc插入mysql一直乱码
  8. html中表格布局还是div布局,Table布局 VS Div+CSS布局,选哪个?
  9. 微擎乐慧云智慧农场源码V1.0.1
  10. es6 babel编译
  11. 面试官:如何实现扫码登录功能?
  12. 干货3分钟搞懂私募投资以及技术面试
  13. Java核心技术整理(九)---持久层、业务层、表现层
  14. 有机咖啡最佳抗氧化的好处
  15. 程序员的自我修养_之三_曾国藩与左宗棠
  16. u-boot使用bootargs给内核传参数
  17. LOL手游登上去服务器维护,lol手游进不去怎么回事?无法登陆解决方法
  18. 惠普HP LaserJet Pro M405d 打印机驱动
  19. Verilog学习总结
  20. MySQL的日志 - redo log

热门文章

  1. 华为:手机王者归来,汽车起死回生
  2. zookeeper连接不上/Session 0x0 for server null, unexpected error, closing socket connection
  3. npm包从创建到发布及下载使用
  4. C语言生成N个随机数组并存入txt文本文件
  5. 机器人强化迁移学习指南:架设模拟和现实的桥梁
  6. linux下运行pl,PS如何在linux下访问PL的寄存器
  7. visual Studio2019和pcl1.10.1安装及实验(无图、不详细)
  8. adb常用命令以及模拟器使用(持续更新中)
  9. 关于web分页展示功能的设计
  10. XML 第三篇(解析)