posenet. terug naar de inleiding naar de schets in fullscreen
In regel 12 wordt het pose array ingeschakeld In regel 16 wordt het array in het console getoond
In regels 18 en 19 wordt de pose en skeleton data in de variabelen pose en skeleton gestopt
structuur van het pose array
in pose[0] bevinden zich 2 array's 1) pose en 2) skeleton
Het aantal cellen in pose wordt bepaald door het aantal gedetecteerde personen
In deze schets wordt alleen cel 0 gebruikt. Posenet kan hier dus maar een persoon detecteren (regel 19)
1) pose bevat 18 array's het keypoints array en 17 array's met de data van de skeletpunten
2) skeleton bevat net zo veel arrays als er skeletpunten worden gedetecteerd dus vaak minder dan 17
Het array van skeleton bevat weer een array met twee cellen met de data van aangrenzende skeletpunten
skeleton, keypoints en de pose skeletpunten array's bevatten dezelfde data maar dan met verschillende structuur.
De data in de array's
1) x positie en y positie van de skeletpunten
2) de betrouwbaarheid score, deze wordt in het pose skeletpunten array confidence genoemd
3) In het keypoints en skeleton array zit ook het stringetje "part" met de namen van de skeletpunten
Bronnen
Youtube tutorial van Daniel Shiffman "Pose Estimation with Posenet"
ml5.js website "PoseNet"
PoseNet op github
PoseNet op TensorFlow
let video;
let poseNet;
let pose;
let skeleton;
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.hide();
poseNet = ml5.poseNet(video, modelLoaded);
//de posenet eventhandler
poseNet.on('pose', gotPoses);
}
function gotPoses(poses) {
console.log(poses);
if (poses.length > 0) {
pose = poses[0].pose;
skeleton = poses[0].skeleton;
}
}
function modelLoaded() {
console.log("poseNet ready");
}
function draw() {
image (video,0,0);
if (pose) {
let eyeR = pose.rightEye;
let eyeL = pose.leftEye;
let d = dist(eyeR.x, eyeR.y, eyeL.x, eyeL.y);
fill(255,0,0);
ellipse(pose.nose.x, pose.nose.y, d/2);
textSize(d/2);
text('neus', pose.nose.x+15 , pose.nose.y);
fill(0,0,255);
ellipse(pose.rightWrist.x, pose.rightWrist.y, 20);
ellipse(pose.leftWrist.x, pose.leftWrist.y, 20);
for (let i = 0; i < pose.keypoints.length; i++) {
let x = pose.keypoints[i].position.x;
let y = pose.keypoints[i].position.y;
fill(0,255,0);
ellipse(x,y,16,16);
}
//elke cel van het skeleton array bevat een array met twee cellen met de data van twee aangrenzende skeletpunten
for (let i = 0; i < skeleton.length; i++) {
let a = skeleton[i][0];
let b = skeleton[i][1];
strokeWeight(2);
stroke(255);
line(a.position.x, a.position.y,b.position.x,b.position.y);
}
}
}