使用FACE++的SDK來做一個顏值計算器

DEMO地址:http://www.gbcphp.com/fly/myface/

FACE++的地址:http://www.faceplusplus.com.cn/


前記:前段時間,關於人臉識別的應用挺火的,比如檢測年齡的啦,還有顏值計算的啦。

雖然這些東西都是曇花一現,但是在很多地方應用還是很廣的,偶爾一些推廣的活動可以結合這些趣味性的應用結合來做。

因爲不知道是怎麼實現的,這裏涉及到太多的算法,自己開發一個人臉識別的算法不太理智,因爲已經有人做出來的東西,如果不是非常必要,就不需要去自己寫。

所以在網上找了一圈,這個face++算是比較理想的,有很多應用都是用了他們的SDK。


具體調用的方法face++上的文檔已經有了,按照上面的步驟去做就行,這裏不贅述。

使用方法:http://www.faceplusplus.com.cn/create-a-new-app/

使用API:http://www.faceplusplus.com.cn/api-overview/


主要寫一下顏值計算這部分。

顏值計算這部分比較具有主觀性,因爲每個人的審美都不一樣,所以只能採用一些標準,比如黃金比例,三庭五眼等標準。

我選擇了三庭五眼這種普遍認爲標準的計算方法。

具體如下:

/* 計算兩點之間的 */
		function distance(px1,py1,px2,py2){
			return Math.sqrt(Math.abs(Math.pow(px2 - px1,2)) + Math.abs(Math.pow(py2 - py1,2)));
		}
	    	
		function comparePic(url2){
			var face1,face2,results,smile = 0;    
     
	        var api = new FacePP('ec7ca9298901a3725b050cd1c683e756', 'aG3Yo9DRXfys5Zh2a8yXoP8A3CqzyRE6');
	        
	       
	        api.request('detection/detect', {
	          url: url2
	        }, function(err, result) {
				if (err) {					
					return;
				}				
				face1 = result;
				
				if(face1.face.length == 0){
					yourscore.innerHTML = '不明物體';
					return;
				}
				
				
				smile = parseInt(face1.face[0].attribute.smiling.value);
				if(smile < 20){
					smile = -10;
				}else{
					smile = parseInt(smile/10);
				}
				
				api.request('/detection/landmark', {
			          face_id: face1.face[0].face_id
			        }, function(err, result) {
						if (err) {					
							return;
						}				
						face2 = result;
						
						//console.log(face2.result)
						if(face2.result.length != 0){
							var yourface = face2.result[0].landmark;
							
							//計算兩眉頭間的距離
							
							var c1 = distance(yourface.left_eyebrow_right_corner.x,yourface.left_eyebrow_right_corner.y,yourface.right_eyebrow_left_corner.x,yourface.right_eyebrow_left_corner.y);
							//console.log('計算兩眉頭間的距離 = ' + c1);
							
							//眉毛之間的中點座標;
							var c1_x = (yourface.right_eyebrow_left_corner.x - yourface.left_eyebrow_right_corner.x )/2 + yourface.left_eyebrow_right_corner.x,
								c1_y = (yourface.right_eyebrow_left_corner.y - yourface.left_eyebrow_right_corner.y)/2 + yourface.left_eyebrow_right_corner.y;
							
							
							//眉毛中點到鼻子最低處的距離
							
							
							var c2 = distance(yourface.nose_contour_lower_middle.x,yourface.nose_contour_lower_middle.y,c1_x,c1_y);
							
							//眼角之間的距離
							
							//console.log('眼角之間的距離 = ' + c3);
							var c3 = distance(yourface.left_eye_right_corner.x,yourface.left_eye_right_corner.y ,yourface.right_eye_left_corner.x,yourface.right_eye_left_corner.y);
							
									
							//鼻子的寬度
							
							
							var c4 = distance(yourface.nose_left.x,yourface.nose_left.y,yourface.nose_right.x,yourface.nose_right.y);
									
							//臉的寬度
							
							var c5 = distance(yourface.contour_left1.x,yourface.contour_left1.y,yourface.contour_right1.x,yourface.contour_right1.y);
							
									
							//下巴到鼻子下方的高度
							
							
							var c6 = distance(yourface.contour_chin.x,yourface.contour_chin.y,yourface.nose_contour_lower_middle.x,yourface.nose_contour_lower_middle.y);
									
							//眼睛的大小
							
							
							var c7_left = distance(yourface.left_eye_left_corner.x,yourface.left_eye_left_corner.y,yourface.left_eye_right_corner.x,yourface.left_eye_right_corner.y);
							var c7_right = distance(yourface.right_eye_left_corner.x,yourface.right_eye_left_corner.y,yourface.right_eye_right_corner.x,yourface.right_eye_right_corner.y);
									
							//嘴巴的大小
							
							
							var c8 = distance(yourface.mouth_left_corner.x,yourface.mouth_left_corner.y,yourface.mouth_right_corner.x,yourface.mouth_right_corner.y);
									
							//嘴巴處的face大小
							
							var c9 = distance(yourface.contour_left6.x,yourface.contour_left6.y,yourface.contour_right6.x,yourface.contour_right6.y);
							
							
							/* 開始計算步驟 */
							var yourmark = 100,mustm = 0;
							
							//眼角距離爲臉寬的1/5,
							mustm += Math.abs((c3/c5)*100 - 25);
							
							
							//鼻子寬度爲臉寬的1/5
							mustm += Math.abs((c4/c5)*100 - 25);
							
							
							//眼睛的寬度,應爲同一水平臉部寬度的!/5
							var eyepj = (c7_left+c7_right)/2;
							mustm += Math.abs(eyepj/c5*100 - 25);
							
							
							//理想嘴巴寬度應爲同一臉部寬度的1/2
							mustm += Math.abs((c8/c9)*100 - 50);
							
							
							//下巴到鼻子下方的高度 == 眉毛中點到鼻子最低處的距離
							mustm += Math.abs(c6 - c2);
							
							
							yourscore.innerHTML = yourmark - parseInt(mustm) + smile;
						}else{
							yourscore.innerHTML = '不明物體';
						}
						
						
						
					});
				
				
			});
		       
		      
		       
	        
		}
		


上面這段代碼就是按照標準去計算的顏值。


注意的地方就是,上傳圖片進行比較的時候,首先圖片要處理一下,不能太大,太大了會失敗。

其二,圖片要使用服務器地址,如果是本地也會出錯。




發佈了74 篇原創文章 · 獲贊 22 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章