let capture = null; let tracker = null; let positions = null; let w = 0, h = 0; function setup() { w = windowWidth; h = windowHeight; capture = createCapture(VIDEO); createCanvas(w, h); capture.size(w, h); capture.hide(); frameRate(10); colorMode(HSB); background(0); tracker = new clm.tracker(); tracker.init(); tracker.start(capture.elt); } function draw() { // Flip the canvas so that we get a mirror image translate(w, 0); scale(-1.0, 1.0); // Uncomment the line below to see the webcam image (and no trail) //image(capture, 0, 0, w, h); positions = tracker.getCurrentPosition(); if (positions.length > 0) { // Eye points from clmtrackr: // https://www.auduno.com/clmtrackr/docs/reference.html const eye1 = { outline: [23, 63, 24, 64, 25, 65, 26, 66].map(getPoint), center: getPoint(27), top: getPoint(24), bottom: getPoint(26) }; const eye2 = { outline: [28, 67, 29, 68, 30, 69, 31, 70].map(getPoint), center: getPoint(32), top: getPoint(29), bottom: getPoint(31) } const irisColor = color(random(360), 80, 80, 0.4); drawEye(eye1, irisColor); drawEye(eye2, irisColor); } } function getPoint(index) { return createVector(positions[index][0], positions[index][1]); } function drawEye(eye, irisColor) { noFill(); stroke(255, 0.4); drawEyeOutline(eye); const irisRadius = min(eye.center.dist(eye.top), eye.center.dist(eye.bottom)); const irisSize = irisRadius * 2; noStroke(); fill(irisColor); ellipse(eye.center.x, eye.center.y, irisSize, irisSize); const pupilSize = irisSize / 3; fill(0, 0.6); ellipse(eye.center.x, eye.center.y, pupilSize, pupilSize); } function drawEyeOutline(eye) { beginShape(); const firstPoint = eye.outline[0]; eye.outline.forEach((p, i) => { curveVertex(p.x, p.y); if (i === 0) { // Duplicate the initial point (see curveVertex documentation) curveVertex(firstPoint.x, firstPoint.y); } if (i === eye.outline.length - 1) { // Close the curve and duplicate the closing point curveVertex(firstPoint.x, firstPoint.y); curveVertex(firstPoint.x, firstPoint.y); } }); endShape(); } function keyPressed() { // Clear background background(0); } function mouseClicked() { const timestamp = timestampString(); saveCanvas("eyeTrail-" + timestamp, "png"); } function timestampString() { return year() + nf(month(), 2) + nf(day(), 2) + "-" + nf(hour(), 2) + nf(minute(), 2) + nf(second(), 2); } function windowResized() { w = windowWidth; h = windowHeight; resizeCanvas(w, h); background(0); }