face++的颜值计算算法实现
class point{ double x; double y; public point(double x,double y){ this.x=x; this.y=y; } } class faceMark{ double smile; point left_eyebrow_right_corner; point right_eyebrow_left_corner; point nose_contour_lower_middle; point left_eye_right_corner; point left_eye_left_corner; point right_eye_left_corner; point right_eye_right_corner; point nose_left; point nose_right; point contour_left1; point contour_right1; point contour_chin; point contour_left6; point contour_right6; point mouth_left_corner; point mouth_right_corner; } public class faceScore{ /* 计算两点之间的 */ public static double distance(point p1, point p2){ return Math.sqrt(Math.abs(Math.pow(p2.x - p1.x,2)) + Math.abs(Math.pow(p2.y - p1.y,2))); } public static double culFaceScore(faceMark face){ if (face.smile < 20){ face.smile = -10; }else{ face.smile = face.smile / 10; } //计算两眉头间的距离 //double c1 = distance(face.left_eyebrow_right_corner,face.right_eyebrow_left_corner); //console.log('计算两眉头间的距离 = ' + c1); //眉毛之间的中点坐标; point eyebrowMid = new point(0, 0); eyebrowMid.x = (face.right_eyebrow_left_corner.x + face.left_eyebrow_right_corner.y)/2 ; eyebrowMid.y = (face.right_eyebrow_left_corner.y + face.left_eyebrow_right_corner.y)/2; //眉毛中点到鼻子最低处的距离 double d1 = distance(face.nose_contour_lower_middle,eyebrowMid); //眼角之间的距离 //console.log('眼角之间的距离 = ' + c3); double d2 = distance(face.left_eye_right_corner,face.right_eye_left_corner); //鼻子的宽度 double d3 = distance(face.nose_left,face.nose_right); //脸的宽度 double d4 = distance(face.contour_left1,face.contour_right1); //下巴到鼻子下方的高度 double d5 = distance(face.contour_chin,face.nose_contour_lower_middle); //眼睛的大小 double d6_left = distance(face.left_eye_left_corner,face.left_eye_right_corner); double d6_right = distance(face.right_eye_left_corner,face.right_eye_right_corner); //嘴巴的大小 double d7 = distance(face.mouth_left_corner,face.mouth_right_corner); //嘴巴处的face大小 double d8 = distance(face.contour_left6,face.contour_right6); /* 开始计算步骤 */ double yourmark = 100, mustm = 0; //眼角距离为脸宽的1/5, mustm += Math.abs((d2/d4)*100 - 25); //鼻子宽度为脸宽的1/5 mustm += Math.abs((d3/d4)*100 - 25); //眼睛的宽度,应为同一水平脸部宽度的1/5 double eyepj = (d6_left+d6_right)/2; mustm += Math.abs(eyepj/d4*100 - 25); //理想嘴巴宽度应为同一脸部宽度的1/2 mustm += Math.abs((d7/d8)*100 - 50); //下巴到鼻子下方的高度 == 眉毛中点到鼻子最低处的距离 mustm += Math.abs(d5 - d1); return yourmark - mustm + face.smile; } public static void main(String[] args) { faceMark face = new faceMark(); face.smile = 4.86501; face.left_eyebrow_right_corner = new point(38.099756, 30.421463); face.right_eyebrow_left_corner = new point(45.671707, 29.460732); face.nose_contour_lower_middle = new point(42.997073, 43.409756); face.left_eye_right_corner = new point(39.17878, 33.430732); face.left_eye_left_corner = new point(32.066098, 33.522927); face.right_eye_left_corner = new point(47.382439, 32.167317); face.right_eye_right_corner = new point(55.089756, 30.516829); face.nose_left = new point(39.161951, 42.39878); face.nose_right = new point(47.571951, 41.289756); face.contour_left1 = new point(29.173415, 34.049268); face.contour_right1 = new point(62.625366,29.352195); face.contour_chin = new point(46.414878, 57.787805); face.contour_left6 = new point(34.497073, 50.051951); face.contour_right6 = new point(61.216585, 48.963171); face.mouth_left_corner = new point(39.00878, 48.307073); face.mouth_right_corner = new point(51.676829, 46.061951); System.out.println(culFaceScore(face)); } }