let img, parts;
let options = {withLandmarks: true, withDescriptors: false};
let r = [];
let g = [];
let b = [];
let q = [];
let w = [];
let e = [];
let slider, val = 0, temp = 1;
let button1, button2, button3;
let b1 = 1, b2 = 0, b3 = 0;
function preload() {
img = loadImage('face.png');
}
function setup() {
createCanvas(img.width*2, img.height*2);
faceapi = ml5.faceApi(options, modelReady);
slider = createSlider(0, 10, 1);
slider.position(width/2, height/2);
button1 = createButton('눈썹');
button1.position(width/2, height/2+30);
button2 = createButton('눈');
button2.position(width/2, height/2+60);
button3 = createButton('입술');
button3.position(width/2, height/2+90);
image(img, img.width, 0);
image(img,0,0);
for(let i=0;i<3;i++)
{
r[i] = [];
g[i] = [];
b[i] = [];
}
r[0][0] = 255;
g[0][0] = 0;
b[0][0] = 0;
r[0][1] = 0;
g[0][1] = 255;
b[0][1] = 0;
r[0][2] = 0;
g[0][2] = 0;
b[0][2] = 255;
r[1][0] = 190;
g[1][0] = 0;
b[1][0] = 255;
r[1][1] = 45;
g[1][1] = 197;
b[1][1] = 244;
r[1][2] = 255;
g[1][2] = 204;
b[1][2] = 0;
r[2][0] = 0;
g[2][0] = 255;
b[2][0] = 255;
r[2][1] = 255;
g[2][1] = 0;
b[2][1] = 255;
r[2][2] = 255;
g[2][2] = 150;
b[2][2] = 0;
}
function draw(){
Eyebraw();
colorbox();
button1.mousePressed(BUTTON1);
button2.mousePressed(BUTTON2);
button3.mousePressed(BUTTON3);
}
function Eyebraw(){
val = slider.value();
if(val != temp){
background(255);
image(img, img.width, 0);
image(img,0,0);
drawFace();
}
temp = val;
}
function BUTTON1(){
b1 = 1;
b2 = 0, b3 = 0;
}
function BUTTON2(){
b2 = 1;
b1 = 0, b3 = 0;
}
function BUTTON3(){
b3 = 1;
b1 = 0, b2 = 0;
}
// 색상 지정 표
function colorbox(){
stroke(0);
strokeWeight(1);
for(let i=0;i<3;i++){
for(let j=0;j<3;j++){
if(mouseX>2+90*i&&mouseX<2+90*(i+1)&&mouseY>img.height+90*j&&mouseY<img.height+90*(j+1)){
if(mouseIsPressed){
if(b1 == 1){
braw(r[i][j],g[i][j],b[i][j]);
q[0]=r[i][j],w[0]=g[i][j],e[0]=b[i][j];
}
else if(b2 == 1){
eyes(r[i][j],g[i][j],b[i][j]);
q[1]=r[i][j],w[1]=g[i][j],e[1]=b[i][j];
}
else if(b3 == 1){
mouse(r[i][j],g[i][j],b[i][j]);
q[2]=r[i][j],w[2]=g[i][j],e[2]=b[i][j];
}
}
fill(r[i][j]-20,g[i][j]-20,b[i][j]-20);
rect(2+90*i,img.height+90*j,90);
}
else {
fill(r[i][j],g[i][j],b[i][j]);
rect(2+90*i,img.height+90*j,90);
}
}
}
}
function modelReady() {
faceapi.detectSingle(img, gotResults);
}
function gotResults(err, results) {
if (err) {
console.error(err);
return;
}
console.log(results);
parts = results.parts;
noFill();
stroke(0);
strokeWeight(1);
drawFace();
}
function drawFace() {
mouse(q[2],w[2],e[2]);
eyes(q[1],w[1],e[1]);
braw(q[0],w[0],e[0]);
//코 만들기
noFill();
stroke(0);
beginShape();
for(let i=0; i<parts.nose.length; i++){
vertex(parts.nose[i]._x, parts.nose[i]._y);
}
endShape();
}
//입술 만들기
function mouse(A,B,C){
fill(A,B,C);
beginShape();
for(let i=0; i<7; i++){
vertex(parts.mouth[i]._x, parts.mouth[i]._y);
}
for(let i=16; i>11; i--){
vertex(parts.mouth[i]._x, parts.mouth[i]._y);
}
vertex(parts.mouth[0]._x, parts.mouth[0]._y);
endShape();
beginShape();
for(let i=6; i<13; i++){
vertex(parts.mouth[i]._x, parts.mouth[i]._y);
}
for(let i=19; i>15; i--){
vertex(parts.mouth[i]._x, parts.mouth[i]._y);
}
vertex(parts.mouth[6]._x, parts.mouth[6]._y);
endShape();
}
//눈 만들기
function eyes(A,B,C){
fill(A,B,C);
beginShape();
for(let i=0; i<parts.leftEye.length; i++){
vertex(parts.leftEye[i]._x, parts.leftEye[i]._y);
}
vertex(parts.leftEye[0]._x, parts.leftEye[0]._y);
endShape();
beginShape();
for(let i=0; i<parts.rightEye.length; i++){
vertex(parts.rightEye[i]._x, parts.rightEye[i]._y);
}
vertex(parts.rightEye[0]._x, parts.rightEye[0]._y);
endShape();
}
//눈썹 만들기
function braw(A,B,C){
noFill();
stroke(A,B,C);
strokeWeight(val);
beginShape();
for(let i=0; i<parts.leftEyeBrow.length; i++){
vertex(parts.leftEyeBrow[i]._x, parts.leftEyeBrow[i]._y);
}
endShape();
beginShape();
for(let i=0; i<parts.rightEyeBrow.length; i++){
vertex(parts.rightEyeBrow[i]._x, parts.rightEyeBrow[i]._y);
}
endShape();
strokeWeight(1);
}