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));
}
}