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

Skip to content

Commit 7325de0

Browse files
committed
holistic
1 parent 59050de commit 7325de0

File tree

3 files changed

+364
-0
lines changed

3 files changed

+364
-0
lines changed

holistic.html

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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="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]/holistic.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+
53+
</div>
54+
</div>
55+
56+
</div>
57+
</nav>
58+
59+
<!-- CONTENTS -->
60+
<div class="container" style="margin-top: 20px;">
61+
62+
<div class="columns">
63+
64+
<!-- WEBCAM INPUT -->
65+
<div class="column">
66+
<article class="panel is-info">
67+
<p class="panel-heading">
68+
Webcam Input
69+
</p>
70+
<div class="panel-block">
71+
<video class="input_video4"></video>
72+
</div>
73+
</article>
74+
</div>
75+
76+
<!-- MEDIAPIPE OUTPUT -->
77+
<div class="column">
78+
<article class="panel is-info">
79+
<p class="panel-heading">
80+
Mediapipe Face, Hands & Pose Detection
81+
</p>
82+
<div class="panel-block">
83+
<canvas class="output4" width="480px" height="480px"></canvas>
84+
</div>
85+
</article>
86+
</div>
87+
</div>
88+
89+
<div class="loading">
90+
<div class="spinner"></div>
91+
</div>
92+
<div style="visibility: hidden" class="control4">
93+
</div>
94+
95+
<script type="text/javascript" src="./js/holistic.js"></script>
96+
</body>
97+
</html>

index.html

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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_detection.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_video1"></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 Detection
80+
</p>
81+
<div class="panel-block">
82+
<canvas class="output1" 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>
92+
93+
<div style="visibility: hidden;" class="control1">
94+
</div>
95+
96+
<script type="text/javascript" src="./js/face.js"></script>
97+
</body>
98+
</html>

js/holistic.js

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
const video4 = document.getElementsByClassName('input_video4')[0];
2+
const out4 = document.getElementsByClassName('output4')[0];
3+
const controlsElement4 = document.getElementsByClassName('control4')[0];
4+
const canvasCtx4 = out4.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 removeElements(landmarks, elements) {
13+
for (const element of elements) {
14+
delete landmarks[element];
15+
}
16+
}
17+
18+
function removeLandmarks(results) {
19+
if (results.poseLandmarks) {
20+
removeElements(
21+
results.poseLandmarks,
22+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 18, 19, 20, 21, 22]);
23+
}
24+
}
25+
26+
function connect(ctx, connectors) {
27+
const canvas = ctx.canvas;
28+
for (const connector of connectors) {
29+
const from = connector[0];
30+
const to = connector[1];
31+
if (from && to) {
32+
if (from.visibility && to.visibility &&
33+
(from.visibility < 0.1 || to.visibility < 0.1)) {
34+
continue;
35+
}
36+
ctx.beginPath();
37+
ctx.moveTo(from.x * canvas.width, from.y * canvas.height);
38+
ctx.lineTo(to.x * canvas.width, to.y * canvas.height);
39+
ctx.stroke();
40+
}
41+
}
42+
}
43+
44+
function onResultsHolistic(results) {
45+
document.body.classList.add('loaded');
46+
removeLandmarks(results);
47+
fpsControl.tick();
48+
49+
canvasCtx4.save();
50+
canvasCtx4.clearRect(0, 0, out4.width, out4.height);
51+
canvasCtx4.drawImage(
52+
results.image, 0, 0, out4.width, out4.height);
53+
canvasCtx4.lineWidth = 5;
54+
if (results.poseLandmarks) {
55+
if (results.rightHandLandmarks) {
56+
canvasCtx4.strokeStyle = '#00FF00';
57+
connect(canvasCtx4, [[
58+
results.poseLandmarks[POSE_LANDMARKS.RIGHT_ELBOW],
59+
results.rightHandLandmarks[0]
60+
]]);
61+
}
62+
if (results.leftHandLandmarks) {
63+
canvasCtx4.strokeStyle = '#FF0000';
64+
connect(canvasCtx4, [[
65+
results.poseLandmarks[POSE_LANDMARKS.LEFT_ELBOW],
66+
results.leftHandLandmarks[0]
67+
]]);
68+
}
69+
}
70+
drawConnectors(
71+
canvasCtx4, results.poseLandmarks, POSE_CONNECTIONS,
72+
{color: '#00FF00'});
73+
drawLandmarks(
74+
canvasCtx4, results.poseLandmarks,
75+
{color: '#00FF00', fillColor: '#FF0000'});
76+
drawConnectors(
77+
canvasCtx4, results.rightHandLandmarks, HAND_CONNECTIONS,
78+
{color: '#00CC00'});
79+
drawLandmarks(
80+
canvasCtx4, results.rightHandLandmarks, {
81+
color: '#00FF00',
82+
fillColor: '#FF0000',
83+
lineWidth: 2,
84+
radius: (data) => {
85+
return lerp(data.from.z, -0.15, .1, 10, 1);
86+
}
87+
});
88+
drawConnectors(
89+
canvasCtx4, results.leftHandLandmarks, HAND_CONNECTIONS,
90+
{color: '#CC0000'});
91+
drawLandmarks(
92+
canvasCtx4, results.leftHandLandmarks, {
93+
color: '#FF0000',
94+
fillColor: '#00FF00',
95+
lineWidth: 2,
96+
radius: (data) => {
97+
return lerp(data.from.z, -0.15, .1, 10, 1);
98+
}
99+
});
100+
drawConnectors(
101+
canvasCtx4, results.faceLandmarks, FACEMESH_TESSELATION,
102+
{color: '#C0C0C070', lineWidth: 1});
103+
drawConnectors(
104+
canvasCtx4, results.faceLandmarks, FACEMESH_RIGHT_EYE,
105+
{color: '#FF3030'});
106+
drawConnectors(
107+
canvasCtx4, results.faceLandmarks, FACEMESH_RIGHT_EYEBROW,
108+
{color: '#FF3030'});
109+
drawConnectors(
110+
canvasCtx4, results.faceLandmarks, FACEMESH_LEFT_EYE,
111+
{color: '#30FF30'});
112+
drawConnectors(
113+
canvasCtx4, results.faceLandmarks, FACEMESH_LEFT_EYEBROW,
114+
{color: '#30FF30'});
115+
drawConnectors(
116+
canvasCtx4, results.faceLandmarks, FACEMESH_FACE_OVAL,
117+
{color: '#E0E0E0'});
118+
drawConnectors(
119+
canvasCtx4, results.faceLandmarks, FACEMESH_LIPS,
120+
{color: '#E0E0E0'});
121+
122+
canvasCtx4.restore();
123+
}
124+
125+
const holistic = new Holistic({locateFile: (file) => {
126+
return `https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/${file}`;
127+
}});
128+
holistic.onResults(onResultsHolistic);
129+
130+
const camera = new Camera(video4, {
131+
onFrame: async () => {
132+
await holistic.send({image: video4});
133+
},
134+
width: 480,
135+
height: 480
136+
});
137+
camera.start();
138+
139+
new ControlPanel(controlsElement4, {
140+
selfieMode: true,
141+
upperBodyOnly: true,
142+
smoothLandmarks: true,
143+
minDetectionConfidence: 0.5,
144+
minTrackingConfidence: 0.5
145+
})
146+
.add([
147+
new StaticText({title: 'MediaPipe Holistic'}),
148+
fpsControl,
149+
new Toggle({title: 'Selfie Mode', field: 'selfieMode'}),
150+
new Toggle({title: 'Upper-body Only', field: 'upperBodyOnly'}),
151+
new Toggle(
152+
{title: 'Smooth Landmarks', field: 'smoothLandmarks'}),
153+
new Slider({
154+
title: 'Min Detection Confidence',
155+
field: 'minDetectionConfidence',
156+
range: [0, 1],
157+
step: 0.01
158+
}),
159+
new Slider({
160+
title: 'Min Tracking Confidence',
161+
field: 'minTrackingConfidence',
162+
range: [0, 1],
163+
step: 0.01
164+
}),
165+
])
166+
.on(options => {
167+
video4.classList.toggle('selfie', options.selfieMode);
168+
holistic.setOptions(options);
169+
});

0 commit comments

Comments
 (0)