当前位置:   article > 正文

vue+express人脸识别_vue 腾讯人脸

vue 腾讯人脸

1.腾讯云注册与登录

登录 - 腾讯云

2.你需要注册注册一个人员

点击新建人员库------> 添加基本信息

3.API Explorer

腾讯云

要记得设置完成参数后获取秘钥

4.下载安装包

使用npm i即可

  1. //生成token
  2. var jwt = require("jsonwebtoken")
  3. //腾讯人脸识别
  4. const tencentcloud = require("tencentcloud-sdk-nodejs-iai");

express 

  1. //生成token包(npm i jsonwebtoken)
  2. var jwt = require("jsonwebtoken")
  3. var express = require("express")
  4. var router = express.Router();
  5. //腾讯人脸识别包(npm i tencentcloud-sdk-nodejs-iai)
  6. const tencentcloud = require("tencentcloud-sdk-nodejs-iai");
  7. router.get('/test', (req, res) => {
  8. res.send({
  9. code: 200,
  10. msg: 'success'
  11. })
  12. })
  13. //人脸识别登录
  14. router.post('/faceLogin', async (req, res) => {
  15. //获取前端传来的base64
  16. let b64 = req.body.b64
  17. const IaiClient = tencentcloud.iai.v20200303.Client;
  18. const clientConfig = {
  19. credential: {
  20. //自己的腾讯secretId
  21. secretId: "自己的腾讯secretId",
  22. //自己的腾讯密匙
  23. secretKey: "自己的腾讯秘钥",
  24. },
  25. region: "ap-beijing", //地域参数(华北地区北京)
  26. profile: {
  27. httpProfile: {
  28. endpoint: "iai.tencentcloudapi.com",
  29. },
  30. },
  31. };
  32. const client = new IaiClient(clientConfig);
  33. const params = {
  34. "GroupIds": [ //你创建的人员库ID
  35. "你创建的人员库ID"
  36. ],
  37. "Image": b64, //图片的base64格式编码
  38. "NeedPersonInfo": 1, //是否返回人员具体信息。0 为关闭,1 为开启。默认为 0。
  39. "QualityControl": 0, //图片质量控制。 0: 不进行控制; 1:较低的质量要求
  40. "FaceMatchThreshold": 85, //人脸对比度设置为大于85才可
  41. };
  42. let doc = await client.SearchFaces(params)
  43. //doc为人脸识别后的返回信息
  44. console.log(doc, 'doc');
  45. if (doc.Results[0].Candidates.length != 0) { //表示当前人脸库有该人员
  46. let personName = doc.Results[0].Candidates[0].PersonName //拿到该人员的名称
  47. console.log(personName, 'personNume');
  48. //生成token
  49. let token = jwt.sign({ "name": personName }, "face", { expiresIn: '1d' })
  50. res.send({
  51. code: 200,
  52. msg: "登录成功!",
  53. token
  54. })
  55. } else {
  56. res.send({
  57. code: 401,
  58. msg: '人脸库无此人!'
  59. })
  60. return false
  61. }
  62. })
  63. module.exports = router;
 5.vue
https://pan.baidu.com/s/1PaluS8Pz1kLYO5ZrWG29_A?pwd=yfvn
提取码: yfvn 

将拿到的js文件夹放在src中的assets中

  1. <template>
  2. <div class="login-wrapper">
  3. <div class="big-box" v-show="isShowV">
  4. <div class="video-box">
  5. <video id="video" width="320" height="240" preload autoplay loop muted></video>
  6. <canvas id="canvas" width="320" height="240"></canvas>
  7. </div>
  8. <div class="success-face">
  9. <canvas id="screenshotCanvas" width="320" height="240"></canvas>
  10. <div class="switch-button">
  11. <el-row>
  12. <el-button type="primary" @click="destroyed">关闭摄像头</el-button>
  13. <el-button type="primary" @click="init">开始识别</el-button>
  14. </el-row>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="login-form">
  19. <div class="title-container">
  20. <div class="t_wel">欢迎登录</div>
  21. <div class="t_site">李小黑</div>
  22. </div>
  23. <div class="form-box">
  24. <el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="demo-ruleForm">
  25. <el-form-item prop="username">
  26. <el-input v-model="ruleForm.username" prefix-icon="el-icon-user-solid" placeholder="请输入用户名"></el-input>
  27. </el-form-item>
  28. <el-form-item prop="password">
  29. <el-input show-password v-model="ruleForm.password" prefix-icon="el-icon-lock" placeholder="请输入密码"></el-input>
  30. </el-form-item>
  31. <el-form-item>
  32. <el-button @keyup.enter="keyDown" type="primary" @click="submitForm('ruleForm')" style="width: 100%;padding: 15px 0">立即登录</el-button>
  33. </el-form-item>
  34. <el-form-item>
  35. <el-button type="text" @click="faceLoginBtn">人脸识别登录</el-button>
  36. </el-form-item>
  37. </el-form>
  38. </div>
  39. </div>
  40. </div>
  41. </template>
  42. <script>
  43. import tracking from '@/assets/js/tracking-min'
  44. import '@/assets/js/face-min.js'
  45. export default {
  46. name: "Login2",
  47. data() {
  48. return {
  49. ruleForm: {
  50. username: 'admin',
  51. password: '123',
  52. },
  53. rules: {
  54. username: [
  55. { required: true, message: '请输入用户名', trigger: 'blur' },
  56. ],
  57. password: [
  58. { required: true, message: '请输入密码', trigger: 'blur' },
  59. ],
  60. },
  61. //人脸识别用到的变量
  62. trackerTask: null,
  63. mediaStreamTrack: null,
  64. video: null,
  65. screenshotCanvas: null,
  66. uploadLock: true, // 上传锁
  67. isShowV:false
  68. };
  69. },
  70. methods: {
  71. //人脸识别登录
  72. faceLoginBtn(){
  73. this.isShowV = this
  74. // this.init()
  75. },
  76. // 初始化设置
  77. init() {
  78. this.video = this.mediaStreamTrack = document.getElementById('video');
  79. this.screenshotCanvas = document.getElementById('screenshotCanvas');
  80. let canvas = document.getElementById('canvas');
  81. let context = canvas.getContext('2d');
  82. // 固定写法
  83. let tracker = new window.tracking.ObjectTracker('face');
  84. tracker.setInitialScale(4);
  85. tracker.setStepSize(2);
  86. tracker.setEdgesDensity(0.1);
  87. //摄像头初始化
  88. this.trackerTask = window.tracking.track('#video', tracker, {
  89. camera: true
  90. });
  91. let _this = this;
  92. //监听图像变化
  93. tracker.on('track', function(event) {
  94. // 检测出人脸 绘画人脸位置
  95. context.clearRect(0, 0, canvas.width, canvas.height);
  96. event.data.forEach(function(rect) {
  97. context.strokeStyle = '#76e535';
  98. context.strokeRect(rect.x, rect.y, rect.width, rect.height);
  99. });
  100. // event.data.length长度为多少代表检测几张人脸
  101. if(_this.uploadLock && event.data.length){
  102. //上传图片
  103. _this.screenshotAndUpload();
  104. }
  105. });
  106. },
  107. // 上传图片
  108. screenshotAndUpload() {
  109. // 上锁避免重复发送请求
  110. this.uploadLock = false;
  111. // 绘制当前帧图片转换为base64格式
  112. let canvas = this.screenshotCanvas;
  113. let video = this.video;
  114. let ctx = canvas.getContext('2d');
  115. ctx.clearRect(0, 0, canvas.width, canvas.height);
  116. ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
  117. //base64Img为最终人像数据
  118. let base64Img = canvas.toDataURL('image/jpeg');
  119. console.log(base64Img.split(',')[1]);
  120. //发送给后端
  121. this.$http.post("http://127.0.0.1:3000/api/faceLogin",{b64:base64Img.split(',')[1]}).then(res=>{
  122. if(res.data.code===200){
  123. //登录成功把token存在浏览器会话存储中
  124. sessionStorage.setItem("token",res.data.token)
  125. this.$message.success(res.data.msg)
  126. this.destroyed();
  127. this.$router.push('index')
  128. }else if(res.data.code===401){
  129. console.log(res.data,'res.data')
  130. this.$message.error(res.data.msg)
  131. this.destroyed();
  132. this.$router.push('/kong')
  133. }else if(res.data.code===251){
  134. console.log(res.data,'res.data')
  135. this.$message.error(res.data.msg)
  136. this.destroyed();
  137. }
  138. })
  139. // 请求接口成功以后打开锁
  140. // this.uploadLock = true;
  141. },
  142. //关闭摄像头
  143. destroyed(){
  144. if(!this.mediaStreamTrack){
  145. return
  146. }
  147. this.mediaStreamTrack.srcObject.getTracks()[0].stop();
  148. this.trackerTask.stop()
  149. this.isShowV = false
  150. },
  151. //键盘事件
  152. keyDown(e){
  153. //如果是回车则执行登录方法
  154. if(e.keyCode === 13){
  155. //需要执行的登录方法
  156. this.submitForm('ruleForm');
  157. }
  158. },
  159. //表单登录按钮
  160. submitForm(formName) {
  161. this.$refs[formName].validate((valid) => {
  162. if (valid) {
  163. this.$message.success('本登录只能使用人脸登录!')
  164. } else {
  165. console.log('error submit!!');
  166. this.$message.error('请填写登录信息!!!')
  167. return false;
  168. }
  169. });
  170. },
  171. },
  172. mounted() {
  173. this.$http.get('http://127.0.0.1:3000/api/test').then(res=>{
  174. console.log(res.data)
  175. })
  176. //绑定事件
  177. window.addEventListener('keydown',this.keyDown);
  178. },
  179. //销毁事件
  180. destroyed(){
  181. window.removeEventListener('keydown',this.keyDown,false);
  182. }
  183. }
  184. </script>
  185. <style lang="scss" scoped>
  186. html,body{
  187. width: 100%;
  188. height: 100%;
  189. }
  190. *{
  191. box-sizing: border-box;
  192. }
  193. .login-wrapper{
  194. background-image: url("../assets/image/1.jpeg");//背景图片自行更改
  195. width: 100%;
  196. height: 100%;
  197. background-repeat: no-repeat;
  198. background-size: 100% 100%;
  199. background-position: center center;
  200. overflow: hidden;
  201. background-size: cover;
  202. .login-form{
  203. position: absolute;
  204. left: 80%;
  205. top: 50%;
  206. -webkit-transform: translate(-50%,-50%);
  207. transform: translate(-50%,-50%);
  208. width: 480px;
  209. height: 465px;
  210. max-width: 100%;
  211. margin-right: 120px;
  212. padding: 40px 70px 0;
  213. overflow: hidden;
  214. background-color: rgba(255,255,255,.1);
  215. border-radius: 15px;
  216. .title-container{
  217. position: relative;
  218. text-align: center;
  219. .t_wel{
  220. font-size: 26px;
  221. line-height: 1;
  222. color: #eee;
  223. margin-bottom: 10px;
  224. }
  225. .t_site{
  226. font-size: 14px;
  227. line-height: 1;
  228. color: #bebebe;
  229. margin-bottom: 26px;
  230. }
  231. }
  232. .form-box{
  233. .el-form{
  234. .el-form-item{
  235. .el-input{
  236. margin-top: 10px;
  237. }
  238. .el-button{
  239. margin-top: 10px;
  240. }
  241. }
  242. }
  243. }
  244. }
  245. .big-box{
  246. position: absolute;
  247. top: 5%;
  248. left: 50%;
  249. width: 320px;
  250. //border: 1px solid #ddd;
  251. //height: 700px;
  252. transform: translate(-50%);
  253. .video-box{
  254. width: 320px;
  255. height: 240px;
  256. #canvas{
  257. position: absolute;
  258. top: 0;
  259. left: 0;
  260. }
  261. }
  262. .success-face{
  263. width: 320px;
  264. height: 240px;
  265. //border: #ddd solid 1px;
  266. }
  267. }
  268. }
  269. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/701548
推荐阅读
相关标签
  

闽ICP备14008679号