xxxxxxxxxx
160
let video;
let poseNet, poses = [];
let lastPoseTime = 0;
const POSE_DELAY = 200; // Adjust delay between pose updates
function setup() {
createCanvas(540, 810);
video = createCapture(VIDEO);
video.size(width, height);
//video.hide();
//video = createVideo("output.mp4");
//video.size(540, 810);
video.loop();
video.hide();
// Initialize PoseNet
poseNet = ml5.poseNet(video,
{
architecture: 'MobileNetV1',
imageScaleFactor: 0.3, // Smaller scale can help with detection
outputStride: 16,
minConfidence: 0.3,
detectionType: 'single'
},() => console.log('PoseNet Loaded'));
poseNet.on('pose', results => poses = results);
}
function draw() {
// Clear the canvas with a purple undertone
background(30, 0, 50); // Dark purple background
// Load video pixels
video.loadPixels();
// Iterate through pixels
for (let y = 0; y < height; y += 10) {
for (let x = 0; x < width; x += 10) {
// Get pixel color
let index = (x + y * width) * 4;
let r = video.pixels[index];
let g = video.pixels[index + 3];
let b = video.pixels[index + 4];
// Calculate brightness with a purple tint
let brightness = (r + g + b) / 3;
// Create a purple-tinted fill
let purple = color(
brightness * 0.6, // Reduced red
brightness * 0.2, // Very low green
brightness * 0.8, // Higher blue to create purple
200 // Opacity
);
fill(purple);
textSize(10);
textAlign(CENTER, CENTER);
text('♡', x, y);
}
}
// Draw skeletal connections
poses.forEach(pose => {
let keypoints = pose.pose.keypoints;
// Comprehensive skeleton connections
let connections = [
// Head and neck connections
//['nose', 'leftEye'],
//['nose', 'rightEye'],
//['leftEye', 'leftEar'],
//['rightEye', 'rightEar'],
// Upper body connections
['leftEar', 'leftShoulder'],
['rightEar', 'rightShoulder'],
['leftShoulder', 'rightShoulder'],
// Arms and hands
['leftShoulder', 'leftElbow'],
['leftElbow', 'leftWrist'],
['rightShoulder', 'rightElbow'],
['rightElbow', 'rightWrist'],
// Torso and hips
['leftShoulder', 'leftHip'],
['rightShoulder', 'rightHip'],
['leftHip', 'rightHip'],
// Legs
['leftHip', 'leftKnee'],
['leftKnee', 'leftAnkle'],
['rightHip', 'rightKnee'],
['rightKnee', 'rightAnkle'],
// Additional cross-body connections
['leftShoulder', 'rightKnee'],
['rightShoulder', 'leftKnee'],
['leftHip', 'rightWrist'],
['rightHip', 'leftWrist']
];
// Draw skeleton connections
connections.forEach(connection => {
let start = keypoints.find(kp => kp.part === connection[0]);
let end = keypoints.find(kp => kp.part === connection[1]);
// More lenient scoring
if (start && end && (start.score > 0.3 || end.score > 0.3)) {
// Color based on connection type
if (connection[0].includes('Shoulder') || connection[1].includes('Shoulder')) {
fill('#D477AF'); // Pink for upper body
} else if (connection[0].includes('Hip') || connection[1].includes('Hip')) {
fill('#EE62B6'); // Lighter pink for hip
} else if (connection[0].includes('Head') || connection[1].includes('Head')) {
fill('#FF69B4'); // Bright pink for head connections
} else {
fill('#62ACEC'); // Soft pink for limbs
}
// Draw letters along the connection
let startX = start.position.x;
let startY = start.position.y;
let endX = end.position.x;
let endY = end.position.y;
// Number of characters to draw along the line
let steps = 10;
for (let i = 0; i <= steps; i++) {
let t = i / steps;
// Sine wave for curve
let curveFactor = sin(t * PI) * 30;
// Bezier-like interpolation
let controlX1 = startX + (endX - startX) * 0.33;
let controlY1 = startY + curveFactor;
let controlX2 = startX + (endX - startX) * 0.66;
let controlY2 = endY + curveFactor;
let x = bezierPoint(startX, controlX1, controlX2, endX, t);
let y = bezierPoint(startY, controlY1, controlY2, endY, t);
textSize(10);
textAlign(CENTER, CENTER);
text('pole', x, y);
}
}
});
});
}