keypoints

 

 cellen 0 t/m 16 van het keypoints array

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

poses keypoints

 de pose array met keypoints en skeletpunten

 

het skelet array hier met 3 cellen

het skelet array hier met 3 cellen 
met array's met aangrenzende skeletpunten
 

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);
     }
  }
}