let video; let poseNet; let pose; let skeleton; var rightEarImg,righthandImg function preload(){ rightEarImg= loadImage("images.jpg") noseImg=loadImage("1f43d.png") //righthandImg=loadImage("6767.png") leftImg=loadImage("0a65a5bf99bc30ff1680178e343a16b5.png") } function setup() { createCanvas(640, 480); //createCanvas(windowWidth, windowHeight); video = createCapture(VIDEO); video.hide(); poseNet = ml5.poseNet(video, modelLoaded); //呼叫在ml5.js上的net函數,用此函數來判斷各位置,呼叫成功即執行function modelLoaded poseNet.on('pose', gotPoses); } function gotPoses(poses) { //console.log(poses); if (poses.length > 0) { pose = poses[0].pose; //把抓到的幾個點,都放置pose變數內 skeleton = poses[0].skeleton; //把相關於骨架的點都放到skeleton變數內 } } function modelLoaded() { //顯示pose model已經準備就緒 console.log('poseNet ready'); } function draw() { background(0); translate(video.width,0) //因為攝影機顯示的是反像的畫面,需要透過這兩條指令來做反轉 scale(-1,1) //因為攝影機顯示的是反像的畫面,需要透過這兩條指令來做反轉 image(video, 0, 0); //顯示你的畫面在螢幕上 if (pose) { let eyeR = pose.rightEye; //抓到右眼資訊,放到eyeR let eyeL = pose.leftEye; //抓到左眼資訊,放到eyeL let d = dist(eyeR.x, eyeR.y, eyeL.x, eyeL.y); //算出左右眼的距離,當作鼻子顯示圓的直徑 //fill(255, 0, 0); //ellipse(pose.nose.x, pose.nose.y, d); //畫出鼻子的圓 fill(0, 0, 255); //ellipse(pose.rightWrist.x, pose.rightWrist.y, 62); //畫出右手腕圓圈 //ellipse(pose.leftWrist.x, pose.leftWrist.y, 62); //畫出左手腕圓圈 //drawKeypoints() //drawSkeleton() if(pose.rightEar.confidence>0.7){ push() translate(pose.rightEar.x-20, pose.rightEar.y) //以找到的右耳位置當作座標原點 imageMode(CENTER); //圖片要以中心點為座標點 scale(-1,1) //左右翻轉 scale(d/280) //縮小到0.15 image(rightEarImg,0, 0) //顯示該圖片 pop() } if(pose.leftEar.confidence>0.7){ push() translate(pose.leftEar.x+20, pose.rightEar.y) imageMode(CENTER); //scale(-1,1) scale(d/280) image(rightEarImg,0, 0) pop() } if(pose.nose.confidence>0.7){ push() translate(pose.nose.x, pose.nose.y-10) //以找到的右耳位置當作座標原點 imageMode(CENTER); //圖片要以中心點為座標點 scale(d/250) //縮小到0.1 image(noseImg,0, 0) //顯示該圖片 pop() } if(pose.rightWrist.confidence>0.2){ push() translate(pose.rightWrist.x, pose.rightWrist.y) //以找到的右耳位置當作座標原點 imageMode(CENTER); //圖片要以中心點為座標點 scale(-1,1) scale(0.3) //縮小到0.1 draw_1(0,0) //顯示該圖片 pop() } if(pose.leftWrist.confidence>0.2){ push() translate(pose.leftWrist.x, pose.leftWrist.y)//以找到的右耳位置當作座標原點 imageMode(CENTER); //圖片要以中心點為座標點 scale(0.3) //縮小到0.1 draw_1(0,0) //顯示該圖片 pop() } if(pose.rightEye.confidence>0.7){ push() translate(pose.rightEye.x, pose.rightEye.y) imageMode(CENTER); //圖片要以中心點為座標點 scale(d/350) image(leftImg,0,0) pop() } if(pose.rightEye.confidence>0.7){ push() translate(pose.rightEye.x, pose.rightEye.y) imageMode(CENTER); //圖片要以中心點為座標點 scale(d/400) image(leftImg,0,0) pop() } if(pose.leftEye.confidence>0.7){ push() translate(pose.leftEye.x, pose.leftEye.y) imageMode(CENTER); //圖片要以中心點為座標點 scale(d/400) image(leftImg,0,0) pop() } } } function drawKeypoints() { for (let i = 0; i < pose.keypoints.length; i++) { let x = pose.keypoints[i].position.x;//找出每一個點的x座標 let y = pose.keypoints[i].position.y;//找出每一個點的y座標 fill(0,255,0); ellipse(x,y,16,16); } //print(pose.keypoints.length) } function drawSkeleton() { for (let i = 0; i < skeleton.length; i++) { let a = skeleton[i][0]; let b = skeleton[i][1]; strokeWeight(2); stroke(255,0,0); line(a.position.x, a.position.y,b.position.x,b.position.y); } } function draw_1(x,y){ var r1=mouseX //定義 var r2=mouseY //定義 var Color_R= r1/2+30 //定義 var Color_G= r1/2+50+r2 //定義 var Color_B= r1/2+10 //定義 ellipse(mouseX, mouseY, 300, 300); fill('black') rect(mouseX-110,mouseY,70,20) rect(mouseX+40,mouseY,70,20) rect(mouseX-40,mouseY+50,80,10) rect(mouseX-40,mouseY+50,10,40) fill(255,240,214) }