xxxxxxxxxx
121
let video;
let poseNet;
let poses = [];
let skeletons = [];
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
// Create a new poseNet method with a single detection
poseNet = ml5.poseNet(video, modelReady);
// This sets up an event that fills the global variable "poses"
// with an array every time new poses are detected
poseNet.on('pose', function (results) {
poses = results;
});
// Hide the video element, and just show the canvas
video.hide();
}
function modelReady() {
// select('#status').html('Model Loaded');
}
function draw() {
background(255);
// image(video, 0, 0, width, height);
// We can call both functions to draw all keypoints and the skeletons
drawKeypoints();
// drawSkeleton();
}
// A function to draw ellipses over the detected keypoints
function drawKeypoints() {
// beginShape();
var points = [];
for (let i = 0; i < poses.length; i++) {
for (let j = 0; j < poses[i].pose.keypoints.length; j++) {
// if (keypoint.score > 0.2) {
points.push({x: poses[i].pose.keypoints[j].position.x, y: poses[i].pose.keypoints[j].position.y});
//}
}
}
const a = {x:0,y:0};
const sqDist = (pointa, pointb) => (pointa.x-pointb.x)**2+(pointa.y-pointb.y)**2;
const res = points.sort((pointa, pointb) => sqDist(a,pointa)-sqDist(a,pointb));
console.log(res);
fill(255, 0 , 0);
stroke(255, 0, 0);
strokeWeight(10);
for (let i = 0; i < res.length; i++){
point(res[i].x, res[i].y);
}
// console.log(points);
for (let i = 0; i < poses.length; i++) {
// console.log(poses[i].pose);
// For each pose detected, loop through all the keypoints
for (let j = 0; j < poses[i].pose.keypoints.length; j++) {
// A keypoint is an object describing a body part (like rightArm or leftShoulder)
let keypoint = poses[i].pose.keypoints[j];
// Only draw an ellipse is the pose probability is bigger than 0.2
if (keypoint.score > 0.2) {
// fill(255, 0, 0, 100);
// noStroke();
// ellipse(keypoint.position.x, keypoint.position.y, 75);
/*
beginShape();
if (keypoint.part == 'nose'){ ellipse(keypoint.position.x, keypoint.position.y, 10); console.log(keypoint.position); }
if (keypoint.part == 'rightEar'){ ellipse(keypoint.position.x, keypoint.position.y, 10); console.log(keypoint.position); }
if (keypoint.part == 'rightEye'){ ellipse(keypoint.position.x, keypoint.position.y, 10); console.log(keypoint.position); }
if (keypoint.part == 'leftEar'){ ellipse(keypoint.position.x, keypoint.position.y, 10); console.log(keypoint.position); }
if (keypoint.part == 'leftEye'){ ellipse(keypoint.position.x, keypoint.position.y, 10); console.log(keypoint.position); }
endShape();
*/
/*
beginShape();
if (keypoint.part == 'rightShoulder'){ curveVertex(keypoint.position.x, keypoint.position.y); console.log(keypoint.position); }
if (keypoint.part == 'rightElbow'){ curveVertex(keypoint.position.x, keypoint.position.y); console.log(keypoint.position); }
if (keypoint.part == 'rightWrist'){ curveVertex(keypoint.position.x, keypoint.position.y); console.log(keypoint.position); }
endShape();
*/
// curveVertex(keypoint.position.x, keypoint.position.y);
// ellipse(keypoint.position.x, keypoint.position.y, 10, 10);
}
}
}
endShape(close);
}
// A function to draw the skeletons
function drawSkeleton() {
// Loop through all the skeletons detected
for (let i = 0; i < poses.length; i++) {
// For every skeleton, loop through all body connections
for (let j = 0; j < poses[i].skeleton.length; j++) {
let partA = poses[i].skeleton[j][0];
let partB = poses[i].skeleton[j][1];
stroke(255, 0, 0);
line(partA.position.x, partA.position.y, partB.position.x, partB.position.y);
}
}
}