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

Skip to content

Commit 5c77bfb

Browse files
committed
hands
1 parent cbb3a37 commit 5c77bfb

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed

hands.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]/hands.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_video3"></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 Hands Detection
81+
</p>
82+
<div class="panel-block">
83+
<canvas class="output3" 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="control3">
93+
</div>
94+
95+
<script type="text/javascript" src="./js/hands.js"></script>
96+
</body>
97+
</html>

js/hands.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
const video3 = document.getElementsByClassName('input_video3')[0];
2+
const out3 = document.getElementsByClassName('output3')[0];
3+
const controlsElement3 = document.getElementsByClassName('control3')[0];
4+
const canvasCtx3 = out3.getContext('2d');
5+
const fpsControl = new FPS();
6+
7+
const spinner = document.querySelector('.loading');
8+
spinner.ontransitionend = () => {
9+
spinner.style.display = 'none';
10+
};
11+
12+
function onResultsHands(results) {
13+
document.body.classList.add('loaded');
14+
fpsControl.tick();
15+
16+
canvasCtx3.save();
17+
canvasCtx3.clearRect(0, 0, out3.width, out3.height);
18+
canvasCtx3.drawImage(
19+
results.image, 0, 0, out3.width, out3.height);
20+
if (results.multiHandLandmarks && results.multiHandedness) {
21+
for (let index = 0; index < results.multiHandLandmarks.length; index++) {
22+
const classification = results.multiHandedness[index];
23+
const isRightHand = classification.label === 'Right';
24+
const landmarks = results.multiHandLandmarks[index];
25+
drawConnectors(
26+
canvasCtx3, landmarks, HAND_CONNECTIONS,
27+
{color: isRightHand ? '#00FF00' : '#FF0000'}),
28+
drawLandmarks(canvasCtx3, landmarks, {
29+
color: isRightHand ? '#00FF00' : '#FF0000',
30+
fillColor: isRightHand ? '#FF0000' : '#00FF00',
31+
radius: (x) => {
32+
return lerp(x.from.z, -0.15, .1, 10, 1);
33+
}
34+
});
35+
}
36+
}
37+
canvasCtx3.restore();
38+
}
39+
40+
const hands = new Hands({locateFile: (file) => {
41+
return `https://cdn.jsdelivr.net/npm/@mediapipe/[email protected]/${file}`;
42+
}});
43+
hands.onResults(onResultsHands);
44+
45+
const camera = new Camera(video3, {
46+
onFrame: async () => {
47+
await hands.send({image: video3});
48+
},
49+
width: 480,
50+
height: 480
51+
});
52+
camera.start();
53+
54+
new ControlPanel(controlsElement3, {
55+
selfieMode: true,
56+
maxNumHands: 2,
57+
minDetectionConfidence: 0.5,
58+
minTrackingConfidence: 0.5
59+
})
60+
.add([
61+
new StaticText({title: 'MediaPipe Hands'}),
62+
fpsControl,
63+
new Toggle({title: 'Selfie Mode', field: 'selfieMode'}),
64+
new Slider(
65+
{title: 'Max Number of Hands', field: 'maxNumHands', range: [1, 4], step: 1}),
66+
new Slider({
67+
title: 'Min Detection Confidence',
68+
field: 'minDetectionConfidence',
69+
range: [0, 1],
70+
step: 0.01
71+
}),
72+
new Slider({
73+
title: 'Min Tracking Confidence',
74+
field: 'minTrackingConfidence',
75+
range: [0, 1],
76+
step: 0.01
77+
}),
78+
])
79+
.on(options => {
80+
video3.classList.toggle('selfie', options.selfieMode);
81+
hands.setOptions(options);
82+
});

0 commit comments

Comments
 (0)