Video:
Gif:
Description:
This project came naturally to me since I'm interested in dance and videography. From the beginning, I was curious about how I could convey movement, choreography, and group dynamics with the motion capture resources provided. I wanted to study how choreography that relied on more than one dancer created compositions with bodies and movements on screen.
Process:
I went through several iterations of how I could convey what I wanted to, so after figuring out how Posenet worked, I ended up making a lot of visual representations of bodies in movement using some of my favorite dance videos. A lot of these I trashed because they looked too clunky and didn't feel right. It felt eh getting rid of several hundred lines of usable material, but in the end, I decided that visual simplicity and readability was more important than the technical work behind it.
I was not aiming for accuracy with this project, and I was okay with an end result that was not so minutely tied to the body in particular since I wanted to visualize several bodies in relation to each other. I wanted some sort of big picture, wholistic experience rather than something dependent on accuracy. Early on, I found that Posenet would never be able to capture the bodies as well as I wanted to, so I decided to use that messiness as an advantage. I kind of like how it sometimes mistakes body parts for each other, or sees a phantom body part in the wall somewhere.
The first, second, and fourth video in the compilation are all choreographies/videographies that I love a lot. The third video is one that I filmed for KPDC, a dance club on campus. I was interested to see how a video that I produced compared to those that I admired.
Still Images:
Code:
// Copyright (c) 2018 ml5 // Copyright (c) 2018 ml5 // // This software is released under the MIT License. // https://opensource.org/licenses/MIT /* === ml5 Example PoseNet example using p5.js === */ // PoseNet with a pre-recorded video, modified from: // https://github.com/ml5js/ml5-examples/blob/master/p5js/PoseNet/sketch.js let poseNet; let poses = []; let poseArray = []; let noseArray = []; let leftWristArray = []; let rightWristArray = []; let rightAnkleArray = []; let video; var videoIsPlaying; function setup() { frameRate(10); videoIsPlaying = false; createCanvas(833, 480); video = createVideo('yabbay.mp4', vidLoad); video.size(width, height); poseNet = ml5.poseNet(video, modelReady); poseNet.on('pose', function(results) { poses = results; if(poses.length > 0){ poseArray.push(poses); } }); video.hide(); } function modelReady() { console.log('Model Loaded'); } function mousePressed(){ vidLoad(); } function draw() { image(video, 0, 0, width, height); //background(0); drawKeypoints(); } function drawKeypoints() { // for (let i = 0; i < poses.length; i++) { // // let pose = poses[i].pose; // // for (let j = 2; j < pose.keypoints.length; j=j+10) { // for (let k = 3; k < pose.keypoints.length; k=k+10){ // for (let l = 4; l < pose.keypoints.length; l=l+10){ // for (let m = 5; m < pose.keypoints.length; m=m+10){ // let keypoint = pose.keypoints[j]; // let keypoint2 = pose.keypoints[k]; // let keypoint3 = pose.keypoints[l]; // let keypoint4 = pose.keypoints[m]; // // if (keypoint.score > 0.2) { // strokeWeight(1); // stroke(255,0,0); // // beginShape(); // curveVertex(keypoint.position.x, keypoint.position.y); // curveVertex(keypoint2.position.x, keypoint2.position.y); // curveVertex(keypoint3.position.x, keypoint3.position.y); // curveVertex(keypoint4.position.x, keypoint4.position.y); // endShape(); // } // } // } // } // } // } for (var i = 0; i < poses.length; i++){ let pose = poses[i].pose; for (var j = 0; j < pose.keypoints.length; j++){ noFill(); strokeWeight(1); makeVectors("nose", pose, j, noseArray); makeVectors("leftWrist", pose, j, leftWristArray); makeVectors("rightAnkle", pose, j, rightAnkleArray); stroke(255); makeConnections(leftWristArray); makeConnections(noseArray); makeConnections(rightAnkleArray); } } } function makeVectors(part, pose, j, partArray){ if(pose.keypoints[j].part == part){ stroke(0, 0, 255); ellipse(pose.keypoints[j].position.x,pose.keypoints[j].position.y, 10); partArray.push(createVector(pose.keypoints[j].position.x,pose.keypoints[j].position.y)); if (partArray.length > 4){ partArray.splice(0,1); } } } function makeConnections(partArray){ beginShape(); for (let k = 0; k < partArray.length; k++){ curveVertex(partArray[k].x, partArray[k].y); } endShape(); } function vidLoad() { video.stop(); video.loop(); videoIsPlaying = true; } function keyPressed(){ if (videoIsPlaying) { video.pause(); videoIsPlaying = false; } else { video.loop(); videoIsPlaying = true; } } |