Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cbb3a37

Browse files
committed
face mesh
1 parent 1698166 commit cbb3a37

File tree

2 files changed

+190
-0
lines changed

2 files changed

+190
-0
lines changed

faceMesh.html

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css">
6+
<link rel="shortcut icon" href="favicon.ico" />
7+
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/control_utils.css" crossorigin="anonymous">
8+
<link rel="stylesheet" type="text/css" href="demo.css" crossorigin="anonymous">
9+
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/camera_utils.js" crossorigin="anonymous"></script>
10+
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/control_utils.js" crossorigin="anonymous"></script>
11+
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/drawing_utils.js" crossorigin="anonymous"></script>
12+
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/face_mesh.js" crossorigin="anonymous"></script>
13+
</head>
14+
15+
<body>
16+
17+
<!-- BULMA NAVBAR -->
18+
<nav class="navbar" role="navigation" aria-label="main navigation">
19+
<div class="navbar-brand">
20+
<a class="navbar-item" href="index.html">
21+
<img src="https://camo.githubusercontent.com/82f2bfa2005e2755362d419da02d788b366506b0d55212c160abd5100f3a8822/68747470733a2f2f312e62702e626c6f6773706f742e636f6d2f2d7753746b30565a44664d6b2f59434330474952507244492f41414141414141414147632f31796a37494f556564766f654f3143754378713745544c57304671586e69366d77434c63424741735948512f733332302f6c6f676f746578742e706e67" >
22+
</a>
23+
24+
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="navbarBasicExample">
25+
<span aria-hidden="true"></span>
26+
<span aria-hidden="true"></span>
27+
<span aria-hidden="true"></span>
28+
</a>
29+
</div>
30+
31+
<div id="navbarBasicExample" class="navbar-menu">
32+
<div class="navbar-start">
33+
<a class="navbar-item" href="face.html">
34+
Face
35+
</a>
36+
37+
<a class="navbar-item" href="faceMesh.html">
38+
Face Mesh
39+
</a>
40+
41+
<a class="navbar-item" href="hands.html">
42+
Hands
43+
</a>
44+
45+
<a class="navbar-item" href="pose.html">
46+
Pose
47+
</a>
48+
49+
<a class="navbar-item" href="holistic.html">
50+
Holistic
51+
</a>
52+
</div>
53+
</div>
54+
55+
</div>
56+
</nav>
57+
58+
<!-- CONTENTS -->
59+
<div class="container" style="margin-top: 20px;">
60+
61+
<div class="columns">
62+
63+
<!-- WEBCAM INPUT -->
64+
<div class="column">
65+
<article class="panel is-info">
66+
<p class="panel-heading">
67+
Webcam Input
68+
</p>
69+
<div class="panel-block">
70+
<video class="input_video2"></video>
71+
</div>
72+
</article>
73+
</div>
74+
75+
<!-- MEDIAPIPE OUTPUT -->
76+
<div class="column">
77+
<article class="panel is-info">
78+
<p class="panel-heading">
79+
Mediapipe Face Mesh
80+
</p>
81+
<div class="panel-block">
82+
<canvas class="output2" width="480px" height="480px"></canvas>
83+
</div>
84+
</article>
85+
</div>
86+
</div>
87+
88+
<div class="loading">
89+
<div class="spinner"></div>
90+
</div>
91+
<div style="visibility: hidden;" class="control2">
92+
</div>
93+
94+
<script type="text/javascript" src="./js/faceMesh.js"></script>
95+
</body>
96+
</html>

js/faceMesh.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
const video2 = document.getElementsByClassName('input_video2')[0];
2+
const out2 = document.getElementsByClassName('output2')[0];
3+
const controlsElement2 = document.getElementsByClassName('control2')[0];
4+
const canvasCtx = out2.getContext('2d');
5+
6+
const fpsControl = new FPS();
7+
const spinner = document.querySelector('.loading');
8+
spinner.ontransitionend = () => {
9+
spinner.style.display = 'none';
10+
};
11+
12+
function onResultsFaceMesh(results) {
13+
document.body.classList.add('loaded');
14+
fpsControl.tick();
15+
16+
canvasCtx.save();
17+
canvasCtx.clearRect(0, 0, out2.width, out2.height);
18+
canvasCtx.drawImage(
19+
results.image, 0, 0, out2.width, out2.height);
20+
if (results.multiFaceLandmarks) {
21+
for (const landmarks of results.multiFaceLandmarks) {
22+
drawConnectors(
23+
canvasCtx, landmarks, FACEMESH_TESSELATION,
24+
{color: '#C0C0C070', lineWidth: 1});
25+
drawConnectors(
26+
canvasCtx, landmarks, FACEMESH_RIGHT_EYE,
27+
{color: '#FF3030'});
28+
drawConnectors(
29+
canvasCtx, landmarks, FACEMESH_RIGHT_EYEBROW,
30+
{color: '#FF3030'});
31+
drawConnectors(
32+
canvasCtx, landmarks, FACEMESH_LEFT_EYE,
33+
{color: '#30FF30'});
34+
drawConnectors(
35+
canvasCtx, landmarks, FACEMESH_LEFT_EYEBROW,
36+
{color: '#30FF30'});
37+
drawConnectors(
38+
canvasCtx, landmarks, FACEMESH_FACE_OVAL,
39+
{color: '#E0E0E0'});
40+
drawConnectors(
41+
canvasCtx, landmarks, FACEMESH_LIPS,
42+
{color: '#E0E0E0'});
43+
}
44+
}
45+
canvasCtx.restore();
46+
}
47+
48+
const faceMesh = new FaceMesh({locateFile: (file) => {
49+
return `https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/${file}`;
50+
}});
51+
faceMesh.onResults(onResultsFaceMesh);
52+
53+
const camera = new Camera(video2, {
54+
onFrame: async () => {
55+
await faceMesh.send({image: video2});
56+
},
57+
width: 480,
58+
height: 480
59+
});
60+
camera.start();
61+
62+
new ControlPanel(controlsElement2, {
63+
selfieMode: true,
64+
maxNumFaces: 1,
65+
minDetectionConfidence: 0.5,
66+
minTrackingConfidence: 0.5
67+
})
68+
.add([
69+
new StaticText({title: 'MediaPipe Face Mesh'}),
70+
fpsControl,
71+
new Toggle({title: 'Selfie Mode', field: 'selfieMode'}),
72+
new Slider({
73+
title: 'Max Number of Faces',
74+
field: 'maxNumFaces',
75+
range: [1, 4],
76+
step: 1
77+
}),
78+
new Slider({
79+
title: 'Min Detection Confidence',
80+
field: 'minDetectionConfidence',
81+
range: [0, 1],
82+
step: 0.01
83+
}),
84+
new Slider({
85+
title: 'Min Tracking Confidence',
86+
field: 'minTrackingConfidence',
87+
range: [0, 1],
88+
step: 0.01
89+
}),
90+
])
91+
.on(options => {
92+
video2.classList.toggle('selfie', options.selfieMode);
93+
faceMesh.setOptions(options);
94+
});

0 commit comments

Comments
 (0)