script.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Usage: testSupport({client?: string, os?: string}[])
  2. // Client and os are regular expressions.
  3. // See: https://cdn.jsdelivr.net/npm/device-detector-js@2.2.10/README.md for
  4. // legal values for client and os
  5. const controls = window;
  6. const drawingUtils = window;
  7. const mpFaceMesh = window;
  8. const config = {
  9. locateFile: (file) => {
  10. return `` +
  11. `${mpFaceMesh.VERSION}/${file}`;
  12. }
  13. };
  14. // Our input frames will come from here.
  15. const videoElement = document.getElementsByClassName('input_video')[0];
  16. const canvasElement = document.getElementsByClassName('output_canvas')[0];
  17. const controlsElement = document.getElementsByClassName('control-panel')[0];
  18. const canvasCtx = canvasElement.getContext('2d');
  19. /**
  20. * Solution options.
  21. */
  22. const solutionOptions = {
  23. selfieMode: true,
  24. enableFaceGeometry: false,
  25. maxNumFaces: 1,
  26. refineLandmarks: false,
  27. minDetectionConfidence: 0.5,
  28. minTrackingConfidence: 0.5
  29. };
  30. // We'll add this to our control panel later, but we'll save it here so we can
  31. // call tick() each time the graph runs.
  32. const fpsControl = new controls.FPS();
  33. // Optimization: Turn off animated spinner after its hiding animation is done.
  34. const spinner = document.querySelector('.loading');
  35. spinner.ontransitionend = () => {
  36. spinner.style.display = 'none';
  37. };
  38. function dis(p1, p2) {
  39. let x = (p1.x - p2.x) ** 2
  40. let y = (p1.y - p2.y) ** 2
  41. let z = (p1.z - p2.z) ** 2
  42. return Math.sqrt(x + y + z)
  43. }
  44. function openMouse(landmarks) {
  45. return dis(landmarks[13], landmarks[14]) / dis(landmarks[78], landmarks[308])
  46. }
  47. function onResults(results) {
  48. // Hide the spinner.
  49. document.body.classList.add('loaded');
  50. // Update the frame rate.
  51. fpsControl.tick();
  52. // Draw the overlays.
  53. canvasCtx.save();
  54. canvasCtx.clearRect(0, 0, canvasElement.width, canvasElement.height);
  55. canvasCtx.drawImage(results.image, 0, 0, canvasElement.width, canvasElement.height);
  56. if (results.multiFaceLandmarks) {
  57. for (const landmarks of results.multiFaceLandmarks) {
  58. drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_TESSELATION, { color: '#fffa', lineWidth: 1 });
  59. // drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_RIGHT_EYE, { color: '#FF3030' , lineWidth: 1});
  60. // drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_RIGHT_EYEBROW, { color: '#FF3030', lineWidth: 1 });
  61. // drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_LEFT_EYE, { color: '#30FF30', lineWidth: 1 });
  62. // drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_LEFT_EYEBROW, { color: '#30FF30' , lineWidth: 1});
  63. // drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_FACE_OVAL, { color: '#E0E0E0' , lineWidth: 1});
  64. // drawingUtils.drawConnectors(canvasCtx, landmarks, mpFaceMesh.FACEMESH_LIPS, { color: '#E0E0E0', lineWidth: 1 });
  65. let isOpenMouse = openMouse(landmarks)
  66. // console.log(isOpenMouse)
  67. parent.postMessage( {from:'面部识别',data:isOpenMouse},'/');
  68. drawingUtils.drawConnectors(canvasCtx, landmarks, [[13, 14], [308, 78]], { color: isOpenMouse>0.2 ? '#FF0000' : '#00FF00' });
  69. }
  70. }
  71. canvasCtx.restore();
  72. }
  73. const faceMesh = new mpFaceMesh.FaceMesh(config);
  74. faceMesh.setOptions(solutionOptions);
  75. faceMesh.onResults(onResults);
  76. // Present a control panel through which the user can manipulate the solution
  77. // options.
  78. new controls
  79. .ControlPanel(controlsElement, solutionOptions)
  80. .add([
  81. new controls.StaticText({ title: '面部识别' }),
  82. fpsControl,
  83. // new controls.Toggle({ title: 'Selfie Mode', field: 'selfieMode' }),
  84. new controls.SourcePicker({
  85. onFrame: async (input, size) => {
  86. const aspect = size.height / size.width;
  87. let width, height;
  88. if (window.innerWidth > window.innerHeight) {
  89. height = window.innerHeight;
  90. width = height / aspect;
  91. }
  92. else {
  93. width = window.innerWidth;
  94. height = width * aspect;
  95. }
  96. canvasElement.width = width;
  97. canvasElement.height = height;
  98. await faceMesh.send({ image: input });
  99. },
  100. }),
  101. ])
  102. .on(x => {
  103. const options = x;
  104. faceMesh.setOptions(options);
  105. });
粤ICP备19079148号