• vue2人脸检测录入


    1.自行去下载tracking.js

    npm install tracking

    2.三个canvas,一个显示完整摄像头,一个在摄像头上显示人脸矩形框,一个截取人脸(提醒大家一下,如果你选择localhost运行预览是不会报错的,但是如果选择IP地址运行预览,肯定是会报错的,因为你的浏览器在不是https协议的情况下不允许打开摄像头)

    1. <template>
    2. <div>
    3. <div>
    4. <p>脸部放入红色矩形框p>
    5. <video id="video" style="transform: rotateY(180deg)" autoplay preload loop muted>video>
    6. <canvas id="overlayCanvas" width="200" height="200" style="position: absolute; top: 20; left: 0; transform: rotateY(180deg);">canvas>
    7. div>
    8. <div>
    9. <p>检测人脸结果p>
    10. <canvas id="fullCanvas" width="200" height="200" style="transform: rotateY(180deg)">canvas>
    11. <canvas id="faceCanvas" width="200" height="200" style="transform: rotateY(180deg); display: none;">canvas>
    12. div>
    13. <div>结果:{{ img }}div>
    14. div>
    15. template>
    16. <script>
    17. //import { userMedia } from '../../utils/utils';
    18. import 'tracking/build/tracking.js';
    19. import 'tracking/build/data/face-min.js';
    20. export default {
    21. data() {
    22. return {
    23. img: '',
    24. videoObj: null,
    25. trackerTask: null,
    26. overlayContext: null
    27. }
    28. },
    29. mounted() {
    30. this.getCompetence()
    31. },
    32. methods: {
    33. openCamera() {
    34. this.$nextTick(() => {
    35. const fullCanvas = document.getElementById('fullCanvas')
    36. const fullContext = fullCanvas.getContext('2d')
    37. const faceCanvas = document.getElementById('faceCanvas')
    38. const faceContext = faceCanvas.getContext('2d')
    39. this.videoObj = document.getElementById('video')
    40. const overlayCanvas = document.getElementById('overlayCanvas')
    41. this.overlayContext = overlayCanvas.getContext('2d')
    42. const tracker = new window.tracking.ObjectTracker('face')
    43. tracker.setInitialScale(4)
    44. tracker.setStepSize(2)
    45. tracker.setEdgesDensity(0.1)
    46. this.trackerTask = window.tracking.track('#video', tracker, { camera: true })
    47. this.img = this.trackerTask
    48. tracker.on('track', (event) => {
    49. if (event.data.length !== 0) {
    50. event.data.forEach((rect) => {
    51. fullContext.clearRect(0, 0, fullCanvas.width, fullCanvas.height)
    52. fullContext.drawImage(this.videoObj, 0, 0, fullCanvas.width, fullCanvas.height)
    53. faceCanvas.width = rect.width
    54. faceCanvas.height = rect.height
    55. faceContext.clearRect(0, 0, faceCanvas.width, faceCanvas.height)
    56. faceContext.drawImage(this.videoObj, rect.x, rect.y, rect.width, rect.height, 0, 0, faceCanvas.width, faceCanvas.height)
    57. // 绘制矩形框到 overlayCanvas
    58. this.overlayContext.clearRect(0, 0, overlayCanvas.width, overlayCanvas.height)
    59. this.overlayContext.strokeStyle = 'red'; // 设置矩形框颜色
    60. this.overlayContext.lineWidth = 2; // 设置矩形框线宽
    61. this.overlayContext.strokeRect(rect.x, rect.y, rect.width, rect.height)
    62. console.log(faceCanvas.toDataURL())
    63. this.img = faceCanvas.toDataURL()
    64. });
    65. }
    66. })
    67. })
    68. },
    69. getCompetence() {
    70. let _this = this;
    71. this.video = document.getElementById("video");
    72. if (navigator.mediaDevices === undefined) {
    73. navigator.mediaDevices = {};
    74. }
    75. if (navigator.mediaDevices.getUserMedia === undefined) {
    76. navigator.mediaDevices.getUserMedia = function (constraints) {
    77. var getUserMedia =
    78. navigator.webkitGetUserMedia ||
    79. navigator.mozGetUserMedia ||
    80. navigator.getUserMedia;
    81. if (!getUserMedia) {
    82. return Promise.reject(
    83. new Error("getUserMedia is not implemented in this browser")
    84. );
    85. }
    86. return new Promise(function (resolve, reject) {
    87. getUserMedia.call(navigator, constraints, resolve, reject);
    88. });
    89. };
    90. }
    91. var constraints = {
    92. video: { width: 200, height: 200, transform: "scaleX(-1)" },
    93. audio: false,
    94. };
    95. navigator.mediaDevices
    96. .getUserMedia(constraints)
    97. .then(function (stream) {
    98. if ("srcObject" in _this.video) {
    99. _this.video.srcObject = stream;
    100. } else {
    101. _this.video.src = window.URL.createObjectURL(stream);
    102. }
    103. _this.video.onloadedmetadata = function (e) {
    104. _this.video.play();
    105. };
    106. _this.openCamera();
    107. })
    108. .catch((err) => {
    109. console.log(err);
    110. });
    111. },
    112. de() {
    113. this.video.srcObject.getTracks()[0].stop();
    114. this.trackerTask.stop();
    115. },
    116. handleCancel() {
    117. this.videoObj.srcObject.getTracks()[0].stop()
    118. this.trackerTask.stop()
    119. },
    120. success(stream) {
    121. this.videoObj.srcObject = stream
    122. this.videoObj.play()
    123. },
    124. error(error) {
    125. console.log(`访问用户媒体设备失败${error.name}, ${error.message}`)
    126. }
    127. },
    128. beforeDestroy() {
    129. this.handleCancel()
    130. }
    131. }
    132. script>

  • 相关阅读:
    C语言:关键字----switch、case、default(开关语句)
    源代码层面分析Appium-inspector工作原理
    vue - Vue脚手架(终结篇)/ vue动画
    白话文解析LiteFlow的理念是什么?什么时候用该怎么用?干货满满
    Go常见的语法题目
    Tomcat环境变量配置教程
    网络安全深入学习第五课——热门框架漏洞(RCE— Apache Shiro 1.2.4反序列化漏洞)
    【问题之书】
    给 Linux0.11 添加网络通信功能 (Day1: 确认 qemu-system-i386 提供了虚拟网卡)
    2024年csdn最新最全面的fiddler教程【1】
  • 原文地址:https://blog.csdn.net/m0_59799878/article/details/133410405