face++的颜值计算算法实现

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


猜你喜欢

转载自blog.csdn.net/LegenDavid/article/details/48343091