xxxxxxxxxx
211
// Based on https://kylemcdonald.github.io/cv-examples/
// original from Check https://github.com/auduno/clmtrackr
var capture;
var tracker;
var w = 640;
var h = 480;
var smile = [1.791711443772715,
0.36695587219820563,
0.5976305643116154
];
var surprise = [1.1954782363034766,
0.43246527771298515,
0.8469001339410582
];
var angry = [1.370670980031475,
0.0458930724185336,
0.4870478112672918
];
var neutral = [1.2510870050617926,0.04463044825551605,0.5946635002196641]
function setup() {
capture = createCapture({
audio: false,
video: {
// deviceId: 'f9627ee514a6db304d8307e3d881458cd8f09ce82cb8cedc2abae198e4461c34',
width: w,
height: h
}
}, function() {
console.log('capture ready.')
});
capture.elt.setAttribute('playsinline', '');
createCanvas(w, h);
capture.size(w, h);
capture.hide();
tracker = new clm.tracker();
tracker.init();
tracker.start(capture.elt);
}
var mouth_openness;
var mouth_width;
var eyebrow_height;
function draw() {
background(100);
// image(capture, 0, 0, w, h);
var positions = tracker.getCurrentPosition();
let outline = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
let left_eyebrow = [15, 16, 17, 18];
let right_eyebrow = [19, 20, 21, 22];
let left_eye = [28, 67, 29, 68, 30, 69, 31, 70];
let right_eye = [23, 63, 24, 64, 25, 65, 26, 66];
let nose_height = [33, 41, 62];
let nose = [34, 35, 36, 42, 37, 43, 38, 39, 40];
let mouth_outer = [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55];
let mouth_inner = [44, 61, 60, 59, 50, 58, 57, 56];
// Check https://github.com/auduno/clmtrackr
noFill();
stroke(255);
strokeWeight(1.0);
if (positions.length == 71) {
beginShape();
for (var i = 0; i < outline.length; i++) {
// vertex(positions[outline[i]][0], positions[outline[i]][1]);
}
endShape();
beginShape();
for (var i = 0; i < left_eyebrow.length; i++) {
vertex(positions[left_eyebrow[i]][0],
positions[left_eyebrow[i]][1]);
}
endShape();
beginShape();
for (var i = 0; i < right_eyebrow.length; i++) {
vertex(positions[right_eyebrow[i]][0],
positions[right_eyebrow[i]][1]);
}
endShape();
beginShape();
for (var i = 0; i < left_eye.length; i++) {
vertex(positions[left_eye[i]][0],
positions[left_eye[i]][1]);
}
endShape(CLOSE);
beginShape();
for (var i = 0; i < right_eye.length; i++) {
vertex(positions[right_eye[i]][0],
positions[right_eye[i]][1]);
}
endShape(CLOSE);
beginShape();
for (var i = 0; i < nose_height.length; i++) {
// vertex(positions[nose_height[i]][0], positions[nose_height[i]][1]);
}
endShape(CLOSE);
beginShape();
for (var i = 0; i < nose.length; i++) {
vertex(positions[nose[i]][0], positions[nose[i]][1]);
}
endShape(CLOSE);
beginShape();
for (var i = 0; i < mouth_outer.length; i++) {
vertex(positions[mouth_outer[i]][0],
positions[mouth_outer[i]][1]);
}
endShape(CLOSE);
beginShape();
for (var i = 0; i < mouth_inner.length; i++) {
vertex(positions[mouth_inner[i]][0],
positions[mouth_inner[i]][1]);
}
endShape(CLOSE);
/*
noStroke();
fill(0);
ellipse(positions[27][0]+random(-3,3),positions[27][1]+random(-3,3),15,15);
ellipse(positions[32][0]+random(-3,3),positions[32][1]+random(-3,3),15,15);
stroke(0,0,255,80);
strokeWeight(random(20));
line(positions[27][0],positions[27][1],random(width), random(height));
line(positions[32][0],positions[32][1],random(width), random(height));
*/
}
if (positions.length > 0) {
var mouthLeft = createVector(positions[44][0], positions[44][1]);
var mouthRight = createVector(positions[50][0], positions[50][1]);
var right_megashira = createVector(positions[25][0], positions[25][1]);
var left_megashira = createVector(positions[30][0], positions[30][1]);
var dist_megashira = right_megashira.dist(left_megashira);
mouth_width = mouthLeft.dist(mouthRight) / dist_megashira;
var left_eyebrow_height = pow(positions[16][0] - positions[32][0], 2) +
pow(positions[16][1] - positions[32][1], 2);
left_eyebrow_height = sqrt(left_eyebrow_height);
var right_eyebrow_height = pow(positions[20][0] - positions[27][0], 2) +
pow(positions[20][1] - positions[27][1], 2);
right_eyebrow_height = sqrt(right_eyebrow_height);
eyebrow_height = (left_eyebrow_height + right_eyebrow_height) / 2;
eyebrow_height = eyebrow_height / dist_megashira;
mouth_openness = dist(positions[60][0], positions[60][1],
positions[57][0], positions[57][1]);
mouth_openness = mouth_openness / dist_megashira;
// 0:mouth_width, 1:mouth_openness, 2:eyebrow_height
var dist_smile = dist(smile[0], smile[1], smile[2],
mouth_width, mouth_openness, eyebrow_height);
var dist_surprise = dist(surprise[0], surprise[1], surprise[2],
mouth_width, mouth_openness, eyebrow_height);
var dist_angry = dist(angry[0], angry[1], angry[2],
mouth_width, mouth_openness, eyebrow_height);
var dist_neutral = dist(neutral[0], neutral[1], neutral[2],
mouth_width, mouth_openness, eyebrow_height);
//print(dist_smile + "," + dist_surprise + "," + dist_angry);
textAlign(CENTER);
noStroke();
fill(255);
textSize(120);
if (dist_smile < dist_surprise && dist_smile < dist_angry && dist_smile < dist_neutral) {
text("SMILE", width / 2, height / 2);
}
else if( dist_surprise < dist_smile && dist_surprise < dist_angry && dist_surprise < dist_neutral){
text("SURPRISE", width/2, height/2);
}
else if( dist_angry < dist_smile && dist_angry < dist_surprise && dist_angry < dist_neutral ){
text("ANGRY", width/2, height/2);
}
else if( dist_neutral < dist_smile && dist_neutral < dist_angry && dist_neutral < dist_surprise ){
}
fill(255, 0, 0);
// uncomment the line below to show an estimate of amount "smiling"
rect(20, 20, smile * 300, 20);
}
}
function keyPressed() {
if (key == ' ') {
print(mouth_width + "," + mouth_openness + "," + eyebrow_height);
}
}