P5 und ML5: Tracking der rechten und linken Hand via Webcam


Über ML5 kann P5 auf Machine-Learning-Modelle zugeifen, die im Bereich der Mustererkennung Dinge ermöglichen, die vor einigen Jahren für einfache Scriptsprachen wie Javascript oder P5 noch undenkbar waren. Einer dieser Hauptbereiche ist die Erkennung von menschlichen Posen und Bewegungen, so dass nun via Javascript/P5 Bewegungen und Posen erfasst und in Zahlen umgesetzt werden können, die dann mit anderen Zahlenwerten (z.B. aus physiologischen Messungen, Timbre Feature Analysen, EEG, Eye-Tracking etc.) in Verbindung gebracht werden können.

Um auf diese Möglichkeiten zugreifen zu können, muss im Header der HTML-Seite neben der P5-Library auch die ML5-Library eingebunden werden. Für das Tracking von beiden Händen benötigt man die neueste ML5 Library unter

https://unpkg.com/ml5@0.20.0-alpha.3/dist/ml5.js

so dass es im Header der Seite folgendermaßen heisst:

<script src="https://unpkg.com/ml5@0.20.0-alpha.3/dist/ml5.js"></script>

Im Script wird nach der Deklarierung der für die Verbindung mit der Handerkennung via handPose und für die Bilddarstellung notwendigen Variablen ...

var handpose; // Array für das von handPose zurückgelieferte Ergebnis
var video; // Variable für das zu analysierende Video
var hands = []; // Array für die erfassten Handkonturen

... mit Hilfe der preload()-Funktion das Modell für die Erkennung mehrerer Hände geladen:

function preload() {
handpose = ml5.handpose(); // Einladen des Handpose-Modells für mehrere Hände.
}

Dann wird die setup-Funktion gestartet, in der sowohl der Canvas zur Darstellung von Video und Handerkennung erstellt wird als auch die Verbindung mit dem Modell für die Handerkennung gestartet wird Der Canvas sollte dabei mindestens so groß wie die Maße des Videos sein:

function setup() {
var container = createCanvas(640,480); // Canvas erstellen, in HD: 1280, 720
container.parent('p5container'); // an DIV-Container anhängen
video = createCapture(VIDEO); // Videoeingang für Webcam erstellen
video.size(640, 480); // Videogröße einstellen
video.hide(); // verstecke das Video (es würde sonst neben dem Canvas zusätzlich zum
// verarbeiteten Video erscheinen)

handpose.detectStart(video, gotHands);// Verbindung zu handPose
// herstellen, um Hände zu erkennen und das Ergebnis in der Variablen hands zu speichern.

}

Sobald die Verbindung zu handPose hergestellt ist, kann das Ergebnis der Erkennung der Hände pro Frame in das Array hands geschrieben werden.

function gotHands(results) {
hands = results; // Ergebnis der Handerkennung pro Frame in das Array hands schreiben.
}

In der draw-Funktion werden dann die einzelnen markanten Punkte der Hand ausgegeben, die dann beliebig weiter verarbeitet werden können, z.B.:

function draw() {
background(255,255,255, 125); // Hintergrund halb durchsichtig gestalten, damit mit der
// Maus zwischen Gesichtskontur und Video hin- und hergeblendet werden kann
cursor(HAND); // Mauszeiger in eine Hand umwandeln
image(video, 0, 0, 640, 480);// zeige das Video in seiner Höhe und
// Weite an

if (hands[0]){ // wenn eine Hand erkannt wird
l_handedness = hands[0].handedness; // ermittle ob linke oder rechte Hand
l_handgelenk = hands[0].wrist; // hole die Koordinaten des Handgelenks
l_daumen1 = hands[0].thumb_cmc; // hole die Koordinaten des Daumens 1
l_daumen2 = hands[0].thumb_mcp; // hole die Koordinaten des Daumens 2
l_daumen3 = hands[0].thumb_ip; // hole die Koordinaten des Daumens 3
l_daumen4 = hands[0].thumb_tip; // hole die Koordinaten des Daumens 4
l_zeigefinger1 = hands[0].index_finger_mcp; // hole die Koordinaten des
// Zeigefingers 1

l_zeigefinger2 = hands[0].index_finger_pip; // hole die Koordinaten des
// Zeigefingers 2

l_zeigefinger3 = hands[0].index_finger_dip; // hole die Koordinaten des
// Zeigefingers 3

l_zeigefinger4 = hands[0].index_finger_tip; // hole die Koordinaten des
// Zeigefingers 4

l_mittelfinger1 = hands[0].middle_finger_mcp; // hole die Koordinaten des
// Mittelfingers 1

l_mittelfinger2 = hands[0].middle_finger_pip; // hole die Koordinaten des
// Mittelfingers 2

l_mittelfinger3 = hands[0].middle_finger_dip; // hole die Koordinaten des
// Mittelfingers 3

l_mittelfinger4 = hands[0].middle_finger_tip; // hole die Koordinaten des
// Mittelfingers 4

l_ringfinger1 = hands[0].ring_finger_mcp; // hole die Koordinaten des
// Ringfingers 1

l_ringfinger2 = hands[0].ring_finger_pip; // hole die Koordinaten des
// Ringfingers 2

l_ringfinger3 = hands[0].ring_finger_dip; // hole die Koordinaten des
// Ringfingers 3

l_ringfinger4 = hands[0].ring_finger_tip; // hole die Koordinaten des
// Ringfingers 4

l_kleinerfinger1 = hands[0].pinky_finger_mcp; // hole die Koordinaten des kleinen
// Fingers 1

l_kleinerfinger2 = hands[0].pinky_finger_pip; // hole die Koordinaten des kleinen
// Fingers 2

l_kleinerfinger3 = hands[0].pinky_finger_dip; // hole die Koordinaten des kleinen
// Fingers 3

l_kleinerfinger4 = hands[0].pinky_finger_tip; // hole die Koordinaten des kleinen
// Fingers 4

// dann füge an den Fingerspitzen ausgefüllte Kreise hinzu
noStroke();fill(150, 50, 50); ellipse(l_daumen4.x, l_daumen4.y,15,15);
noStroke();fill(150, 150, 50); ellipse(l_zeigefinger4.x, l_zeigefinger4.y,15,15);
noStroke();fill(50, 150, 50); ellipse(l_mittelfinger4.x, l_mittelfinger4.y,15,15);
noStroke();fill(50, 150, 150); ellipse(l_ringfinger4.x, l_ringfinger4.y,15,15);
noStroke();fill(50, 50, 150); ellipse(l_kleinerfinger4.x, l_kleinerfinger4.y,15,15);
noStroke();fill(150, 150, 150); ellipse(l_handgelenk.x, l_handgelenk.y,15,15);

// dann verbinde die erkannten Punkte miteinander und zeige es als Skelett auf dem Bildschirm
noFill();
strokeWeight(2);
stroke(150, 50, 50);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_daumen1.x, l_daumen1.y);
vertex(l_daumen2.x, l_daumen2.y);
vertex(l_daumen3.x, l_daumen3.y);
vertex(l_daumen4.x, l_daumen4.y);
endShape();

stroke(150, 150, 50);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_zeigefinger1.x, l_zeigefinger1.y);
vertex(l_zeigefinger2.x, l_zeigefinger2.y);
vertex(l_zeigefinger3.x, l_zeigefinger3.y);
vertex(l_zeigefinger4.x, l_zeigefinger4.y);
endShape();

stroke(50, 150, 50);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_mittelfinger1.x, l_mittelfinger1.y);
vertex(l_mittelfinger2.x, l_mittelfinger2.y);
vertex(l_mittelfinger3.x, l_mittelfinger3.y);
vertex(l_mittelfinger4.x, l_mittelfinger4.y);
endShape();

stroke(50, 150, 150);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_ringfinger1.x, l_ringfinger1.y);
vertex(l_ringfinger2.x, l_ringfinger2.y);
vertex(l_ringfinger3.x, l_ringfinger3.y);
vertex(l_ringfinger4.x, l_ringfinger4.y);
endShape();

stroke(50, 50, 150);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_kleinerfinger1.x, l_kleinerfinger1.y);
vertex(l_kleinerfinger2.x, l_kleinerfinger2.y);
vertex(l_kleinerfinger3.x, l_kleinerfinger3.y);
vertex(l_kleinerfinger4.x, l_kleinerfinger4.y);
endShape();

stroke(150, 150, 150);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_daumen2.x, l_daumen2.y);
vertex(l_zeigefinger1.x, l_zeigefinger1.y);
vertex(l_mittelfinger1.x, l_mittelfinger1.y);
vertex(l_ringfinger1.x, l_ringfinger1.y);
vertex(l_kleinerfinger1.x, l_kleinerfinger1.y);
vertex(l_handgelenk.x, l_handgelenk.y);

endShape();

}


if (hands[1]){ // wenn eine zweite Hand erkannt wird
r_handedness = hands[1].handedness; // ermittle ob linke oder rechte Hand
r_handgelenk = hands[1].wrist; // hole die Koordinaten des Handgekenks
r_daumen1 = hands[1].thumb_cmc; // hole die Koordinaten des Daumens 1
r_daumen2 = hands[1].thumb_mcp; // hole die Koordinaten des Daumens 2
r_daumen3 = hands[1].thumb_ip; // hole die Koordinaten des Daumens 3
r_daumen4 = hands[1].thumb_tip; // hole die Koordinaten des Daumens 4
r_zeigefinger1 = hands[1].index_finger_mcp; // hole die Koordinaten des
// Zeigefingers 1

r_zeigefinger2 = hands[1].index_finger_pip; // hole die Koordinaten des
// Zeigefingers 2

r_zeigefinger3 = hands[1].index_finger_dip; // hole die Koordinaten des
// Zeigefingers 3

r_zeigefinger4 = hands[1].index_finger_tip; // hole die Koordinaten des
// Zeigefingers 4

r_mittelfinger1 = hands[1].middle_finger_mcp; // hole die Koordinaten des
// Mittelfingers 1

r_mittelfinger2 = hands[1].middle_finger_pip; // hole die Koordinaten des
// Mittelfingers 2

r_mittelfinger3 = hands[1].middle_finger_dip; // hole die Koordinaten des
// Mittelfingers 3

r_mittelfinger4 = hands[1].middle_finger_tip; // hole die Koordinaten ddes
// Mittelfingers 4

r_ringfinger1 = hands[1].ring_finger_mcp; // hole die Koordinaten des
// Ringfingers 1

r_ringfinger2 = hands[1].ring_finger_pip; // hole die Koordinaten des
// Ringfingers 2

r_ringfinger3 = hands[1].ring_finger_dip; // hole die Koordinaten des
// Ringfingers 3

r_ringfinger4 = hands[1].ring_finger_tip; // hole die Koordinaten des
// Ringfingers 4

r_kleinerfinger1 = hands[1].pinky_finger_mcp; // hole die Koordinaten des kleinen
// Fingers 1

r_kleinerfinger2 = hands[1].pinky_finger_pip; // hole die Koordinaten des kleinen
// Fingers 2

r_kleinerfinger3 = hands[1].pinky_finger_dip; // hole die Koordinaten des kleinen
// Fingers 3

r_kleinerfinger4 = hands[1].pinky_finger_tip; // hole die Koordinaten des kleinen
// Fingers 4

// dann füge an den Fingerspitzen ausgefüllte Kreise hinzu
noStroke();fill(150, 50, 50); ellipse(r_daumen4.x, r_daumen4.y,15,15);
noStroke();fill(150, 150, 50); ellipse(r_zeigefinger4.x, r_zeigefinger4.y,15,15);
noStroke();fill(50, 150, 50); ellipse(r_mittelfinger4.x, r_mittelfinger4.y,15,15);
noStroke();fill(50, 150, 150); ellipse(r_ringfinger4.x, r_ringfinger4.y,15,15);
noStroke();fill(50, 50, 150); ellipse(r_kleinerfinger4.x, r_kleinerfinger4.y,15,15);
noStroke();fill(150, 150, 150); ellipse(r_handgelenk.x, r_handgelenk.y,15,15);

// dann verbinde die erkannten Punkte miteinander und zeige es als Skelett auf dem Bildschirm
noFill();
strokeWeight(2);
stroke(150, 50, 50);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_daumen1.x, r_daumen1.y);
vertex(r_daumen2.x, r_daumen2.y);
vertex(r_daumen3.x, r_daumen3.y);
vertex(r_daumen4.x, r_daumen4.y);
endShape();

stroke(150, 150, 50);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_zeigefinger1.x, r_zeigefinger1.y);
vertex(r_zeigefinger2.x, r_zeigefinger2.y);
vertex(r_zeigefinger3.x, r_zeigefinger3.y);
vertex(r_zeigefinger4.x, r_zeigefinger4.y);
endShape();

stroke(50, 150, 50);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_mittelfinger1.x, r_mittelfinger1.y);
vertex(r_mittelfinger2.x, r_mittelfinger2.y);
vertex(r_mittelfinger3.x, r_mittelfinger3.y);
vertex(r_mittelfinger4.x, r_mittelfinger4.y);
endShape();

stroke(50, 150, 150);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_ringfinger1.x, r_ringfinger1.y);
vertex(r_ringfinger2.x, r_ringfinger2.y);
vertex(r_ringfinger3.x, r_ringfinger3.y);
vertex(r_ringfinger4.x, r_ringfinger4.y);
endShape();

stroke(50, 50, 150);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_kleinerfinger1.x, r_kleinerfinger1.y);
vertex(r_kleinerfinger2.x, r_kleinerfinger2.y);
vertex(r_kleinerfinger3.x, r_kleinerfinger3.y);
vertex(r_kleinerfinger4.x, r_kleinerfinger4.y);
endShape();

stroke(150, 150, 150);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_daumen1.x, r_daumen1.y);
vertex(r_zeigefinger1.x, r_zeigefinger1.y);
vertex(r_mittelfinger1.x, r_mittelfinger1.y);
vertex(r_ringfinger1.x, r_ringfinger1.y);
vertex(r_kleinerfinger1.x, r_kleinerfinger1.y);
vertex(r_handgelenk.x, r_handgelenk.y);
endShape();
}

 



Insgesamt sieht das Script dann folgendermaßen aus:

<script src="https://unpkg.com/ml5@0.20.0-alpha.3/dist/ml5.js"></script>
<script src="header/p5.js"></script>

<script>

var handpose; // Array für das von handPose zurückgelieferte Ergebnis
var video; // Variable für das zu analysierende Video
var hands = []; // Array für die erfassten Handkonturen

function preload() {
handpose = ml5.handpose(); // Einladen des Handpose-Modells für mehrere Hände.
}

function setup() {
var container = createCanvas(640,480); // Canvas erstellen, in HD: 1280, 720
container.parent('p5container'); // an DIV-Container anhängen
video = createCapture(VIDEO); // Videoeingang für Webcam erstellen
video.size(640, 480); // Videogröße einstellen
video.hide(); // verstecke das Video (es würde sonst neben dem Canvas zusätzlich zum
// verarbeiteten Video erscheinen)

handpose.detectStart(video, gotHands);// Verbindung zu handPose
// herstellen, um Hände zu erkennen und das Ergebnis in der Variablen hands zu speichern.

}

function draw() {
background(255,255,255, 125); // Hintergrund halb durchsichtig gestalten, damit mit der
// Maus zwischen Gesichtskontur und Video hin- und hergeblendet werden kann
cursor(HAND); // Mauszeiger in eine Hand umwandeln
image(video, 0, 0, 640, 480);// zeige das Video in seiner Höhe und
// Weite an

if (hands[0]){ // wenn eine Hand erkannt wird
l_handedness = hands[0].handedness; // ermittle ob linke oder rechte Hand
l_handgelenk = hands[0].wrist; // hole die Koordinaten des Handgelenks
l_daumen1 = hands[0].thumb_cmc; // hole die Koordinaten des Daumens 1
l_daumen2 = hands[0].thumb_mcp; // hole die Koordinaten des Daumens 2
l_daumen3 = hands[0].thumb_ip; // hole die Koordinaten des Daumens 3
l_daumen4 = hands[0].thumb_tip; // hole die Koordinaten des Daumens 4
l_zeigefinger1 = hands[0].index_finger_mcp; // hole die Koordinaten des
// Zeigefingers 1

l_zeigefinger2 = hands[0].index_finger_pip; // hole die Koordinaten des
// Zeigefingers 2

l_zeigefinger3 = hands[0].index_finger_dip; // hole die Koordinaten des
// Zeigefingers 3

l_zeigefinger4 = hands[0].index_finger_tip; // hole die Koordinaten des
// Zeigefingers 4

l_mittelfinger1 = hands[0].middle_finger_mcp; // hole die Koordinaten des
// Mittelfingers 1

l_mittelfinger2 = hands[0].middle_finger_pip; // hole die Koordinaten des
// Mittelfingers 2

l_mittelfinger3 = hands[0].middle_finger_dip; // hole die Koordinaten des
// Mittelfingers 3

l_mittelfinger4 = hands[0].middle_finger_tip; // hole die Koordinaten des
// Mittelfingers 4

l_ringfinger1 = hands[0].ring_finger_mcp; // hole die Koordinaten des
// Ringfingers 1

l_ringfinger2 = hands[0].ring_finger_pip; // hole die Koordinaten des
// Ringfingers 2

l_ringfinger3 = hands[0].ring_finger_dip; // hole die Koordinaten des
// Ringfingers 3

l_ringfinger4 = hands[0].ring_finger_tip; // hole die Koordinaten des
// Ringfingers 4

l_kleinerfinger1 = hands[0].pinky_finger_mcp; // hole die Koordinaten des kleinen
// Fingers 1

l_kleinerfinger2 = hands[0].pinky_finger_pip; // hole die Koordinaten des kleinen
// Fingers 2

l_kleinerfinger3 = hands[0].pinky_finger_dip; // hole die Koordinaten des kleinen
// Fingers 3

l_kleinerfinger4 = hands[0].pinky_finger_tip; // hole die Koordinaten des kleinen
// Fingers 4

// dann füge an den Fingerspitzen ausgefüllte Kreise hinzu
noStroke();fill(150, 50, 50); ellipse(l_daumen4.x, l_daumen4.y,15,15);
noStroke();fill(150, 150, 50); ellipse(l_zeigefinger4.x, l_zeigefinger4.y,15,15);
noStroke();fill(50, 150, 50); ellipse(l_mittelfinger4.x, l_mittelfinger4.y,15,15);
noStroke();fill(50, 150, 150); ellipse(l_ringfinger4.x, l_ringfinger4.y,15,15);
noStroke();fill(50, 50, 150); ellipse(l_kleinerfinger4.x, l_kleinerfinger4.y,15,15);
noStroke();fill(150, 150, 150); ellipse(l_handgelenk.x, l_handgelenk.y,15,15);

// dann verbinde die erkannten Punkte miteinander und zeige es als Skelett auf dem Bildschirm
noFill();
strokeWeight(2);
stroke(150, 50, 50);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_daumen1.x, l_daumen1.y);
vertex(l_daumen2.x, l_daumen2.y);
vertex(l_daumen3.x, l_daumen3.y);
vertex(l_daumen4.x, l_daumen4.y);
endShape();

stroke(150, 150, 50);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_zeigefinger1.x, l_zeigefinger1.y);
vertex(l_zeigefinger2.x, l_zeigefinger2.y);
vertex(l_zeigefinger3.x, l_zeigefinger3.y);
vertex(l_zeigefinger4.x, l_zeigefinger4.y);
endShape();

stroke(50, 150, 50);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_mittelfinger1.x, l_mittelfinger1.y);
vertex(l_mittelfinger2.x, l_mittelfinger2.y);
vertex(l_mittelfinger3.x, l_mittelfinger3.y);
vertex(l_mittelfinger4.x, l_mittelfinger4.y);
endShape();

stroke(50, 150, 150);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_ringfinger1.x, l_ringfinger1.y);
vertex(l_ringfinger2.x, l_ringfinger2.y);
vertex(l_ringfinger3.x, l_ringfinger3.y);
vertex(l_ringfinger4.x, l_ringfinger4.y);
endShape();

stroke(50, 50, 150);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_kleinerfinger1.x, l_kleinerfinger1.y);
vertex(l_kleinerfinger2.x, l_kleinerfinger2.y);
vertex(l_kleinerfinger3.x, l_kleinerfinger3.y);
vertex(l_kleinerfinger4.x, l_kleinerfinger4.y);
endShape();

stroke(150, 150, 150);
beginShape();
vertex(l_handgelenk.x, l_handgelenk.y);
vertex(l_daumen2.x, l_daumen2.y);
vertex(l_zeigefinger1.x, l_zeigefinger1.y);
vertex(l_mittelfinger1.x, l_mittelfinger1.y);
vertex(l_ringfinger1.x, l_ringfinger1.y);
vertex(l_kleinerfinger1.x, l_kleinerfinger1.y);
vertex(l_handgelenk.x, l_handgelenk.y);

endShape();

}


if (hands[1]){ // wenn eine zweite Hand erkannt wird
r_handedness = hands[1].handedness; // ermittle ob linke oder rechte Hand
r_handgelenk = hands[1].wrist; // hole die Koordinaten des Handgekenks
r_daumen1 = hands[1].thumb_cmc; // hole die Koordinaten des Daumens 1
r_daumen2 = hands[1].thumb_mcp; // hole die Koordinaten des Daumens 2
r_daumen3 = hands[1].thumb_ip; // hole die Koordinaten des Daumens 3
r_daumen4 = hands[1].thumb_tip; // hole die Koordinaten des Daumens 4
r_zeigefinger1 = hands[1].index_finger_mcp; // hole die Koordinaten des
// Zeigefingers 1

r_zeigefinger2 = hands[1].index_finger_pip; // hole die Koordinaten des
// Zeigefingers 2

r_zeigefinger3 = hands[1].index_finger_dip; // hole die Koordinaten des
// Zeigefingers 3

r_zeigefinger4 = hands[1].index_finger_tip; // hole die Koordinaten des
// Zeigefingers 4

r_mittelfinger1 = hands[1].middle_finger_mcp; // hole die Koordinaten des
// Mittelfingers 1

r_mittelfinger2 = hands[1].middle_finger_pip; // hole die Koordinaten des
// Mittelfingers 2

r_mittelfinger3 = hands[1].middle_finger_dip; // hole die Koordinaten des
// Mittelfingers 3

r_mittelfinger4 = hands[1].middle_finger_tip; // hole die Koordinaten ddes
// Mittelfingers 4

r_ringfinger1 = hands[1].ring_finger_mcp; // hole die Koordinaten des
// Ringfingers 1

r_ringfinger2 = hands[1].ring_finger_pip; // hole die Koordinaten des
// Ringfingers 2

r_ringfinger3 = hands[1].ring_finger_dip; // hole die Koordinaten des
// Ringfingers 3

r_ringfinger4 = hands[1].ring_finger_tip; // hole die Koordinaten des
// Ringfingers 4

r_kleinerfinger1 = hands[1].pinky_finger_mcp; // hole die Koordinaten des kleinen
// Fingers 1

r_kleinerfinger2 = hands[1].pinky_finger_pip; // hole die Koordinaten des kleinen
// Fingers 2

r_kleinerfinger3 = hands[1].pinky_finger_dip; // hole die Koordinaten des kleinen
// Fingers 3

r_kleinerfinger4 = hands[1].pinky_finger_tip; // hole die Koordinaten des kleinen
// Fingers 4

// dann füge an den Fingerspitzen ausgefüllte Kreise hinzu
noStroke();fill(150, 50, 50); ellipse(r_daumen4.x, r_daumen4.y,15,15);
noStroke();fill(150, 150, 50); ellipse(r_zeigefinger4.x, r_zeigefinger4.y,15,15);
noStroke();fill(50, 150, 50); ellipse(r_mittelfinger4.x, r_mittelfinger4.y,15,15);
noStroke();fill(50, 150, 150); ellipse(r_ringfinger4.x, r_ringfinger4.y,15,15);
noStroke();fill(50, 50, 150); ellipse(r_kleinerfinger4.x, r_kleinerfinger4.y,15,15);
noStroke();fill(150, 150, 150); ellipse(r_handgelenk.x, r_handgelenk.y,15,15);

// dann verbinde die erkannten Punkte miteinander und zeige es als Skelett auf dem Bildschirm
noFill();
strokeWeight(2);
stroke(150, 50, 50);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_daumen1.x, r_daumen1.y);
vertex(r_daumen2.x, r_daumen2.y);
vertex(r_daumen3.x, r_daumen3.y);
vertex(r_daumen4.x, r_daumen4.y);
endShape();

stroke(150, 150, 50);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_zeigefinger1.x, r_zeigefinger1.y);
vertex(r_zeigefinger2.x, r_zeigefinger2.y);
vertex(r_zeigefinger3.x, r_zeigefinger3.y);
vertex(r_zeigefinger4.x, r_zeigefinger4.y);
endShape();

stroke(50, 150, 50);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_mittelfinger1.x, r_mittelfinger1.y);
vertex(r_mittelfinger2.x, r_mittelfinger2.y);
vertex(r_mittelfinger3.x, r_mittelfinger3.y);
vertex(r_mittelfinger4.x, r_mittelfinger4.y);
endShape();

stroke(50, 150, 150);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_ringfinger1.x, r_ringfinger1.y);
vertex(r_ringfinger2.x, r_ringfinger2.y);
vertex(r_ringfinger3.x, r_ringfinger3.y);
vertex(r_ringfinger4.x, r_ringfinger4.y);
endShape();

stroke(50, 50, 150);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_kleinerfinger1.x, r_kleinerfinger1.y);
vertex(r_kleinerfinger2.x, r_kleinerfinger2.y);
vertex(r_kleinerfinger3.x, r_kleinerfinger3.y);
vertex(r_kleinerfinger4.x, r_kleinerfinger4.y);
endShape();

stroke(150, 150, 150);
beginShape();
vertex(r_handgelenk.x, r_handgelenk.y);
vertex(r_daumen1.x, r_daumen1.y);
vertex(r_zeigefinger1.x, r_zeigefinger1.y);
vertex(r_mittelfinger1.x, r_mittelfinger1.y);
vertex(r_ringfinger1.x, r_ringfinger1.y);
vertex(r_kleinerfinger1.x, r_kleinerfinger1.y);
vertex(r_handgelenk.x, r_handgelenk.y);
endShape();
}

}

</script>

<DIV id="p5container" style="width:640px;height:480px;border: 1px solid #333;box-shadow: 8px 8px 5px #444;padding: 8px 12px;background-color:ffffff"></DIV>