xxxxxxxxxx
93
/*
* The Field / 2025
* Uroš Krčadinac / Marko Milić
* Čovek Nečovek
*/
let video;
let poseNet;
let poses = [];
function setup() {
createCanvas(640, 480);
video = createCapture(VIDEO);
video.size(width, height);
// Initialize PoseNet
poseNet = ml5.poseNet(video, modelReady);
poseNet.on('pose', function (results) {
poses = results;
});
video.hide();
}
function modelReady() {
select('#status').html('Model Loaded');
}
function draw() {
image(video, 0, 0, width, height);
filter(GRAY);
let poseDetected = isValidPose();
textFont('Roboto');
textSize(50);
textAlign(CENTER, CENTER);
textStyle(BOLD);
let textColor = poseDetected ? '#ffb901' : '#ff3975';
let message = poseDetected ? 'ČOVEK!' : 'NEČOVEK.';
fill(textColor);
strokeWeight(1);
stroke(textColor);
text(message, width / 2, height / 4);
if (poseDetected) {
drawKeypoints(textColor);
drawSkeleton(textColor);
}
}
function isValidPose() {
if (poses.length === 0) return false;
let validKeypoints = 0;
for (let i = 0; i < poses[0].pose.keypoints.length; i++) {
if (poses[0].pose.keypoints[i].score > 0.5) {
validKeypoints++;
}
}
// Require at least 10 keypoints with confidence > 0.5
return validKeypoints >= 10;
}
function drawKeypoints(color) {
for (let i = 0; i < poses.length; i++) {
for (let j = 0; j < poses[i].pose.keypoints.length; j++) {
let keypoint = poses[i].pose.keypoints[j];
if (keypoint.score > 0.5) {
fill(color);
noStroke();
ellipse(keypoint.position.x, keypoint.position.y, 10, 10);
}
}
}
}
function drawSkeleton(color) {
for (let i = 0; i < poses.length; i++) {
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(color);
strokeWeight(3);
line(partA.position.x, partA.position.y, partB.position.x, partB.position.y);
}
}
}