commit
						69c45a9304
					
				 23 changed files with 494 additions and 0 deletions
			
			
		| @ -0,0 +1,46 @@ | |||||
|  | class Face { | ||||
|  | 
 | ||||
|  | 	constructor(image, emotions){ | ||||
|  | 		this.image = image; | ||||
|  | 		this.emotions = emotions; | ||||
|  | 		this.position = createVector(width / 2, height /2); | ||||
|  | 		this.destination = createVector(0, 0); | ||||
|  | 		this.isFinished = false; | ||||
|  | 		this.positionRandom(); | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	 | ||||
|  | 
 | ||||
|  | 	emotionCheck() { | ||||
|  | 		let { neutral, happy, angry, sad, disgusted, surprised, fearful } = this.emotions; | ||||
|  | 		if (happy > 0.5) return true; | ||||
|  | 		return false; | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	// Set's a random destination
 | ||||
|  | 	positionRandom() { | ||||
|  | 		this.destination.set(random(0, windowWidth), random(0, windowHeight)); | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	// Draws face to the canvas
 | ||||
|  | 	drawImage() { | ||||
|  | 		if (!this.isFinished) { | ||||
|  | 			this.checkDistance(); | ||||
|  | 			this.position.set(p5.Vector.slerp(this.position, this.destination, 0.1)); | ||||
|  | 			image(this.image, this.position.x, this.position.y); | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	// Distance between to vectors
 | ||||
|  | 	checkDistance() { | ||||
|  | 		if(p5.Vector.dist(this.position, this.destination) < 0.1) this.isFinished = true; | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	// Add's face to the main image
 | ||||
|  | 	addFaceToImage() { | ||||
|  | 		// Returns 
 | ||||
|  | 		return false; | ||||
|  | 	} | ||||
|  | 	 | ||||
|  | 
 | ||||
|  | } | ||||
| @ -0,0 +1,17 @@ | |||||
|  | <!DOCTYPE html> | ||||
|  | <html> | ||||
|  |   <head> | ||||
|  |     <meta charset="UTF-8" /> | ||||
|  |     <title>face-api</title> | ||||
|  |     <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/p5.js"></script> | ||||
|  |     <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/addons/p5.sound.js"></script> | ||||
|  |     <script src="https://cdn.jsdelivr.net/gh/ml5js/Intro-ML-Arts-IMA@ml5-build-10-7-19/ml5_build/ml5.min.js"></script> | ||||
|  |     <link rel="stylesheet" type="text/css" href="style.css" /> | ||||
|  |     <meta charset="utf-8" /> | ||||
|  |   </head> | ||||
|  | 
 | ||||
|  |   <body> | ||||
|  |     <script src="sketch.js"></script> | ||||
|  | 	<script src="face.js"></script> | ||||
|  |   </body> | ||||
|  | </html> | ||||
| @ -0,0 +1,10 @@ | |||||
|  | { | ||||
|  |   "compilerOptions": { | ||||
|  |     "target": "es6" | ||||
|  |   }, | ||||
|  |   "include": [ | ||||
|  |     "*.js", | ||||
|  |     "**/*.js", | ||||
|  |     "c:\\Users\\caile\\.vscode\\extensions\\samplavigne.p5-vscode-1.2.15\\p5types\\global.d.ts" | ||||
|  |   ] | ||||
|  | } | ||||
								
									Binary file not shown.
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									Binary file not shown.
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									Binary file not shown.
								
							
						
					| @ -0,0 +1 @@ | |||||
|  | [{"weights":[{"name":"dense0/conv0/filters","shape":[3,3,3,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008194216092427571,"min":-0.9423348506291708}},{"name":"dense0/conv0/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006839508168837603,"min":-0.8412595047670252}},{"name":"dense0/conv1/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009194007106855804,"min":-1.2779669878529567}},{"name":"dense0/conv1/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0036026100317637128,"min":-0.3170296827952067}},{"name":"dense0/conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.000740380117706224,"min":-0.06367269012273527}},{"name":"dense0/conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},{"name":"dense0/conv2/pointwise_filter","shape":[1,1,32,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":1,"min":0}},{"name":"dense0/conv2/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0037702228508743585,"min":-0.6220867703942692}},{"name":"dense1/conv0/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0033707996209462483,"min":-0.421349952618281}},{"name":"dense1/conv0/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014611541991140328,"min":-1.8556658328748217}},{"name":"dense1/conv0/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002832523046755323,"min":-0.30307996600281956}},{"name":"dense1/conv1/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006593170586754294,"min":-0.6329443763284123}},{"name":"dense1/conv1/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.012215249211180444,"min":-1.6001976466646382}},{"name":"dense1/conv1/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002384825547536214,"min":-0.3028728445370992}},{"name":"dense1/conv2/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005859645441466687,"min":-0.7617539073906693}},{"name":"dense1/conv2/pointwise_filter","shape":[1,1,64,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013121426806730382,"min":-1.7845140457153321}},{"name":"dense1/conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032247188044529336,"min":-0.46435950784122243}},{"name":"dense2/conv0/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002659512618008782,"min":-0.32977956463308894}},{"name":"dense2/conv0/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015499923743453681,"min":-1.9839902391620712}},{"name":"dense2/conv0/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0032450980999890497,"min":-0.522460794098237}},{"name":"dense2/conv1/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005911862382701799,"min":-0.792189559282041}},{"name":"dense2/conv1/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021025861478319356,"min":-2.2077154552235325}},{"name":"dense2/conv1/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00349616945958605,"min":-0.46149436866535865}},{"name":"dense2/conv2/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008104994250278847,"min":-1.013124281284856}},{"name":"dense2/conv2/pointwise_filter","shape":[1,1,128,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.029337059282789044,"min":-3.5791212325002633}},{"name":"dense2/conv2/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0038808938334969913,"min":-0.4230174278511721}},{"name":"fc/weights","shape":[128,136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.014016061670639936,"min":-1.8921683255363912}},{"name":"fc/bias","shape":[136],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0029505149698724935,"min":0.088760145008564}}],"paths":["face_landmark_68_tiny_model-shard1"]}] | ||||
								
									Binary file not shown.
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									Binary file not shown.
								
							
						
					| @ -0,0 +1 @@ | |||||
|  | [{"paths":["mtcnn_model-shard1"],"weights":[{"dtype":"float32","name":"pnet/conv1/weights","shape":[3,3,3,10]},{"dtype":"float32","name":"pnet/conv1/bias","shape":[10]},{"dtype":"float32","name":"pnet/prelu1_alpha","shape":[10]},{"dtype":"float32","name":"pnet/conv2/weights","shape":[3,3,10,16]},{"dtype":"float32","name":"pnet/conv2/bias","shape":[16]},{"dtype":"float32","name":"pnet/prelu2_alpha","shape":[16]},{"dtype":"float32","name":"pnet/conv3/weights","shape":[3,3,16,32]},{"dtype":"float32","name":"pnet/conv3/bias","shape":[32]},{"dtype":"float32","name":"pnet/prelu3_alpha","shape":[32]},{"dtype":"float32","name":"pnet/conv4_1/weights","shape":[1,1,32,2]},{"dtype":"float32","name":"pnet/conv4_1/bias","shape":[2]},{"dtype":"float32","name":"pnet/conv4_2/weights","shape":[1,1,32,4]},{"dtype":"float32","name":"pnet/conv4_2/bias","shape":[4]},{"dtype":"float32","name":"rnet/conv1/weights","shape":[3,3,3,28]},{"dtype":"float32","name":"rnet/conv1/bias","shape":[28]},{"dtype":"float32","name":"rnet/prelu1_alpha","shape":[28]},{"dtype":"float32","name":"rnet/conv2/weights","shape":[3,3,28,48]},{"dtype":"float32","name":"rnet/conv2/bias","shape":[48]},{"dtype":"float32","name":"rnet/prelu2_alpha","shape":[48]},{"dtype":"float32","name":"rnet/conv3/weights","shape":[2,2,48,64]},{"dtype":"float32","name":"rnet/conv3/bias","shape":[64]},{"dtype":"float32","name":"rnet/prelu3_alpha","shape":[64]},{"dtype":"float32","name":"rnet/fc1/weights","shape":[576,128]},{"dtype":"float32","name":"rnet/fc1/bias","shape":[128]},{"dtype":"float32","name":"rnet/prelu4_alpha","shape":[128]},{"dtype":"float32","name":"rnet/fc2_1/weights","shape":[128,2]},{"dtype":"float32","name":"rnet/fc2_1/bias","shape":[2]},{"dtype":"float32","name":"rnet/fc2_2/weights","shape":[128,4]},{"dtype":"float32","name":"rnet/fc2_2/bias","shape":[4]},{"dtype":"float32","name":"onet/conv1/weights","shape":[3,3,3,32]},{"dtype":"float32","name":"onet/conv1/bias","shape":[32]},{"dtype":"float32","name":"onet/prelu1_alpha","shape":[32]},{"dtype":"float32","name":"onet/conv2/weights","shape":[3,3,32,64]},{"dtype":"float32","name":"onet/conv2/bias","shape":[64]},{"dtype":"float32","name":"onet/prelu2_alpha","shape":[64]},{"dtype":"float32","name":"onet/conv3/weights","shape":[3,3,64,64]},{"dtype":"float32","name":"onet/conv3/bias","shape":[64]},{"dtype":"float32","name":"onet/prelu3_alpha","shape":[64]},{"dtype":"float32","name":"onet/conv4/weights","shape":[2,2,64,128]},{"dtype":"float32","name":"onet/conv4/bias","shape":[128]},{"dtype":"float32","name":"onet/prelu4_alpha","shape":[128]},{"dtype":"float32","name":"onet/fc1/weights","shape":[1152,256]},{"dtype":"float32","name":"onet/fc1/bias","shape":[256]},{"dtype":"float32","name":"onet/prelu5_alpha","shape":[256]},{"dtype":"float32","name":"onet/fc2_1/weights","shape":[256,2]},{"dtype":"float32","name":"onet/fc2_1/bias","shape":[2]},{"dtype":"float32","name":"onet/fc2_2/weights","shape":[256,4]},{"dtype":"float32","name":"onet/fc2_2/bias","shape":[4]},{"dtype":"float32","name":"onet/fc2_3/weights","shape":[256,10]},{"dtype":"float32","name":"onet/fc2_3/bias","shape":[10]}]}] | ||||
								
									Binary file not shown.
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					
								
									Binary file not shown.
								
							
						
					| @ -0,0 +1 @@ | |||||
|  | [{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}] | ||||
| @ -0,0 +1 @@ | |||||
|  | p5 sketch with BodyPix (: | ||||
| @ -0,0 +1,47 @@ | |||||
|  | let bodypix; | ||||
|  | let video; | ||||
|  | let segmentation; | ||||
|  | let img; | ||||
|  | let ready = false; | ||||
|  | 
 | ||||
|  | const options = { | ||||
|  | 	outputStride: 16,  | ||||
|  | 	segmentationThreshold: 0.3  | ||||
|  |   } | ||||
|  | 
 | ||||
|  | function preload() { | ||||
|  | 	video = createCapture(VIDEO); | ||||
|  | 	bodypix = ml5.bodyPix(video, options, modelReady) | ||||
|  | } | ||||
|  | 
 | ||||
|  | function setup() { | ||||
|  | 	createCanvas(480, 360); | ||||
|  | 	video.size(480, 360); | ||||
|  | } | ||||
|  | 
 | ||||
|  | function modelReady(){ | ||||
|  | 	console.log('model ready!'); | ||||
|  | 	ready = true; | ||||
|  | 	bodypix.segment(gotResults) | ||||
|  | } | ||||
|  | 
 | ||||
|  | function gotResults(err, result) { | ||||
|  | 	if (err) { | ||||
|  | 		console.log(err) | ||||
|  | 		return | ||||
|  | 	} | ||||
|  | 	 | ||||
|  | 	segmentation = result;	 | ||||
|  | 	bodypix.segment(gotResults) | ||||
|  | } | ||||
|  | 
 | ||||
|  | function draw() { | ||||
|  | 	background(0); | ||||
|  | 	image(video, 0, 0, 480, 360) | ||||
|  | 	if(ready){ | ||||
|  | 		if(segmentation) { | ||||
|  | 			image(segmentation.maskBackground, 0, 0, 480, 360) | ||||
|  | 		  console.log(segmentation) | ||||
|  | 	  } | ||||
|  | 	} | ||||
|  | } | ||||
| @ -0,0 +1,215 @@ | |||||
|  | let detections = []; | ||||
|  | let fps; | ||||
|  | let video; | ||||
|  | let boxDimensions; | ||||
|  | let boxScale; | ||||
|  | let canvas; | ||||
|  | let face; | ||||
|  | let newImg; | ||||
|  | let lm; | ||||
|  | let staticImage; | ||||
|  | 
 | ||||
|  | let faces = []; | ||||
|  | 
 | ||||
|  | // ROI
 | ||||
|  | // let roi;
 | ||||
|  | // let lmBuffer;
 | ||||
|  | const detectionOptions = { | ||||
|  |     withLandmarks: true, | ||||
|  |     withExpressions: true, | ||||
|  |     withDescriptors: true, | ||||
|  |     minConfidence: 0.5, | ||||
|  | 	Mobilenetv1Model: "models", | ||||
|  | 	FaceLandmarkModel: "models", | ||||
|  | 	FaceRecognitionModel: "models", | ||||
|  | 	FaceExpressionModel: "models", | ||||
|  | }; | ||||
|  | 
 | ||||
|  | function setup() { | ||||
|  | 	 | ||||
|  |   frameRate(60); | ||||
|  |   pixelDensity(1); | ||||
|  |   canvas = createCanvas(windowWidth, windowHeight); | ||||
|  |   video = createCapture(VIDEO); | ||||
|  |   video.size(480, 360); | ||||
|  |   video.hide(); | ||||
|  |   newImg = createImage(480, 360); | ||||
|  |   staticImage = createGraphics(width, height); | ||||
|  |   staticImage.background(0, 0, 0); | ||||
|  |   faceapi = ml5.faceApi(video, detectionOptions, faceReady); | ||||
|  | } | ||||
|  | 
 | ||||
|  | function draw() { | ||||
|  | 	image(staticImage, 0, 0); | ||||
|  | 	background(0, 0, 0, 0); | ||||
|  | 	drawFaces(); | ||||
|  | 	removeFinishedImages(); | ||||
|  | 	faceapi.detect(gotFaces); | ||||
|  | 	 | ||||
|  | } | ||||
|  | 
 | ||||
|  | function faceReady() { | ||||
|  |   faceapi.detect(gotFaces); | ||||
|  | } | ||||
|  | 
 | ||||
|  | function gotFaces(error, result) { | ||||
|  |   if (error) { | ||||
|  |     console.log(error); | ||||
|  |     return; | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   detections = result; | ||||
|  | 
 | ||||
|  |   if (detections) { | ||||
|  | 	if (detections.length > 0) { | ||||
|  | 		drawLandmarkMask(detections); | ||||
|  | 	  } | ||||
|  |   } | ||||
|  | } | ||||
|  | 
 | ||||
|  | function drawLandmarkMask(detections) { | ||||
|  | 	if (detections.length > 0) { | ||||
|  | 		for (f = 0; f < detections.length; f++) { | ||||
|  | 			let { _x, _y, _width, _height } = detections[f].alignedRect._box; | ||||
|  | 			let points = detections[f].landmarks.positions; | ||||
|  | 
 | ||||
|  | 			updateGraphicsObject(points); | ||||
|  | 			updateNewImage(_x, _y, _width, _height); | ||||
|  | 
 | ||||
|  | 			face = new Face(roi, detections[f].expressions); | ||||
|  | 
 | ||||
|  | 			if(face.emotionCheck()){ | ||||
|  | 				faces.push(face); | ||||
|  | 			} | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | function updateNewImage(_x, _y, _width, _height) { | ||||
|  | 
 | ||||
|  | 	// Cross-checks with mask, to see what pixels are transparent, if they are not, use those pixels in final image
 | ||||
|  | 	lm.loadPixels(); | ||||
|  | 	video.loadPixels(); | ||||
|  | 	newImg.loadPixels(); | ||||
|  | 
 | ||||
|  | 	for (let i = 0; i < newImg.pixels.length; i += 4) { | ||||
|  | 		if (lm.pixels[i + 3] == 255) { | ||||
|  | 			newImg.pixels[i + 0] = video.pixels[i + 0]; | ||||
|  | 			newImg.pixels[i + 1] = video.pixels[i + 1]; | ||||
|  | 			newImg.pixels[i + 2] = video.pixels[i + 2]; | ||||
|  | 			newImg.pixels[i + 3] = 180; | ||||
|  | 		} else { | ||||
|  | 			newImg.pixels[i + 0] = 0 | ||||
|  | 			newImg.pixels[i + 1] = 0 | ||||
|  | 			newImg.pixels[i + 2] = 0 | ||||
|  | 			newImg.pixels[i + 3] = 0 | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	lm.remove(); | ||||
|  | 
 | ||||
|  | 	newImg.updatePixels(); | ||||
|  | 
 | ||||
|  | 	roi = newImg.get(_x, _y, _width, _height); | ||||
|  | } | ||||
|  | 
 | ||||
|  | function updateGraphicsObject(points) { | ||||
|  | 
 | ||||
|  | 	// Creates graphics mask with face mesh
 | ||||
|  | 
 | ||||
|  | 	lm = createGraphics(480, 360); | ||||
|  | 	lm.background(0, 0, 0, 0) | ||||
|  | 	lm.fill(0); | ||||
|  | 	lm.beginShape(); | ||||
|  | 	lm.vertex(points[19]._x,points[19]._y ) | ||||
|  | 
 | ||||
|  | 	for (let i = 0; i < 17; i++) { | ||||
|  | 		lm.vertex(points[i]._x, points[i]._y); | ||||
|  | 	} | ||||
|  | 
 | ||||
|  | 	lm.vertex(points[24]._x,points[24]._y ) | ||||
|  | 	lm.endShape(CLOSE);	 | ||||
|  | } | ||||
|  | 
 | ||||
|  | function drawFaces() { | ||||
|  | 	for(let i = 0; i < faces.length; i++) { | ||||
|  | 		faces[i].drawImage(); | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | function removeFinishedImages() { | ||||
|  | 	for (let i = faces.length - 1; i >= 0; i--) { | ||||
|  | 		if(faces[i].isFinished) { | ||||
|  | 			staticImage.image(faces[i].image, faces[i].position.x, faces[i].position.y); | ||||
|  | 			faces.splice(i, 1); | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | function drawBoxs(detections) { | ||||
|  |   if (detections.length > 0) { | ||||
|  |     //If at least 1 face is detected:
 | ||||
|  |     for (f = 0; f < detections.length; f++) { | ||||
|  |       let { _x, _y, _width, _height } = detections[f].alignedRect._box; | ||||
|  |       stroke(44, 169, 225); | ||||
|  |       strokeWeight(1); | ||||
|  |       noFill(); | ||||
|  |       rect(_x, _y, _width, _height); | ||||
|  |     } | ||||
|  |   } | ||||
|  | } | ||||
|  | 
 | ||||
|  | function drawLandmarks(detections) { | ||||
|  |   if (detections.length > 0) { | ||||
|  |     //If at least 1 face is detected:
 | ||||
|  |     for (f = 0; f < detections.length; f++) { | ||||
|  |       let points = detections[f].landmarks.positions; | ||||
|  |       for (let i = 0; i < points.length; i++) { | ||||
|  |         stroke(44, 169, 225); | ||||
|  |         strokeWeight(3); | ||||
|  |         point(points[i]._x, points[i]._y); | ||||
|  |       } | ||||
|  |     } | ||||
|  |   } | ||||
|  | } | ||||
|  | 
 | ||||
|  | function drawExpressions(detections, x, y, textYSpace) { | ||||
|  |   if (detections.length > 0) { | ||||
|  |     //If at least 1 face is detected:
 | ||||
|  |     let { neutral, happy, angry, sad, disgusted, surprised, fearful } = | ||||
|  |       detections[0].expressions; | ||||
|  |     textFont("Helvetica Neue"); | ||||
|  |     textSize(14); | ||||
|  |     noStroke(); | ||||
|  |     fill(44, 169, 225); | ||||
|  | 
 | ||||
|  |     text("neutral:       " + nf(neutral * 100, 2, 2) + "%", x, y); | ||||
|  |     text("happiness: " + nf(happy * 100, 2, 2) + "%", x, y + textYSpace); | ||||
|  |     text("anger:        " + nf(angry * 100, 2, 2) + "%", x, y + textYSpace * 2); | ||||
|  |     text("sad:            " + nf(sad * 100, 2, 2) + "%", x, y + textYSpace * 3); | ||||
|  |     text( | ||||
|  |       "disgusted: " + nf(disgusted * 100, 2, 2) + "%", | ||||
|  |       x, | ||||
|  |       y + textYSpace * 4 | ||||
|  |     ); | ||||
|  |     text( | ||||
|  |       "surprised:  " + nf(surprised * 100, 2, 2) + "%", | ||||
|  |       x, | ||||
|  |       y + textYSpace * 5 | ||||
|  |     ); | ||||
|  |     text( | ||||
|  |       "fear:           " + nf(fearful * 100, 2, 2) + "%", | ||||
|  |       x, | ||||
|  |       y + textYSpace * 6 | ||||
|  |     ); | ||||
|  |   } else { | ||||
|  |     //If no faces is detected:
 | ||||
|  |     text("neutral: ", x, y); | ||||
|  |     text("happiness: ", x, y + textYSpace); | ||||
|  |     text("anger: ", x, y + textYSpace * 2); | ||||
|  |     text("sad: ", x, y + textYSpace * 3); | ||||
|  |     text("disgusted: ", x, y + textYSpace * 4); | ||||
|  |     text("surprised: ", x, y + textYSpace * 5); | ||||
|  |     text("fear: ", x, y + textYSpace * 6); | ||||
|  |   } | ||||
|  | } | ||||
| @ -0,0 +1,8 @@ | |||||
|  | html, body { | ||||
|  |   margin: 0; | ||||
|  |   padding: 0; | ||||
|  | } | ||||
|  | 
 | ||||
|  | canvas { | ||||
|  |   display: block; | ||||
|  | } | ||||
					Loading…
					
					
				
		Reference in new issue