面相分析
古代的人认为相由心生,人的一生祸福荣辱都和面相息息相关,因此发展出了麻衣神相等各种面相预测术,现在也有人牵根据人的面相好坏来研究成功学,发现长的好看的确实比长得丑的人容易获得帮助和成功,这就有些牵强附会了。
大自然神秘莫测,玄妙无比,既然一切事物都有从诞生发展到消亡的过程,一切生命也都有生老病死的固定的无法改变的自然规律,也许可能存在一条生命的规律,可以指导芸芸众生奔向成功。掌握了各种规律,就掌握了事物的发展过程,天机术士和预言家们费尽心机,穷经皓首,试图通过已有规律破解生命的终极奥秘,从而演化出每个生命的可能轨迹。但命运不可捉摸,有些人命运不好,有些人一直受到上帝的眷顾,在希腊神话中,有位命运之神,专门负责每个人的命运,我们民间也充满了各种星宿下凡的神话,当然这都是唯心的。算命之术信则有,不信则无,无疑也是唯心的。
机器学习横空出世,使得人们可以利用大数据和概率统计从而在科学上给预测术新的发展,一且都变得可以量化的,一切都变得那么清晰,一切都可以足够精确,连发生的概率都可以精确到小数点后N位,脸的大小,五官的颜色亮度形状大小,各宫位的相对位置距离颜色,一切都奕得可以测量可以量化,可以不同角度取值平均化,科学而精确。这里我们试着使用机器学习标定面相并做简单的分析,也可以验证一些古老的预测术成功率有多高。
通过人脸识别技术,
1.可以在人脸上找到影响巨大的部位宫位
2.可以获取宫位的坐标,从而计算各宫位的相对位置大小和比例
3.可以获取五官的位置和大小,根据其占人脸之比例分析
4.可以获取各宫位的颜色明暗,通过技术处理去掉相处之中的反光,然后使用直方图分析各部位和人脸的明暗关系,印堂发暗是可以比人眼更准确的分析得到
如下图:
代码获取五官之大小,形状,分暗等图像空间
if (bPic) {
Paint p = new Paint();
p.setColor(Color.RED);
//p.setStyle(Paint.Style.FILL_AND_STROKE);
p.setStyle(Paint.Style.STROKE);
Path path = new Path();
path.moveTo((int) (landmarks.get(48).x * resizeRatio), (int) (landmarks.get(48).y * resizeRatio));
for (int i = 48 + 1; i < landmarks.size(); i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
path.close();
canvas.drawPath(path, p);
path.reset();
path.moveTo((int) (landmarks.get(17).x * resizeRatio), (int) (landmarks.get(17).y * resizeRatio));
for (int i = 17 + 1; i < 22; i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
path.close();
canvas.drawPath(path, p);
path.reset();
path.moveTo((int) (landmarks.get(22).x * resizeRatio), (int) (landmarks.get(22).y * resizeRatio));
for (int i = 22 + 1; i < 27; i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
path.close();
canvas.drawPath(path, p);
path.reset();
path.moveTo((int) (landmarks.get(36).x * resizeRatio), (int) (landmarks.get(36).y * resizeRatio));
for (int i = 36 + 1; i < 42; i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
path.close();
canvas.drawPath(path, p);
Path path3 = new Path();
path3.moveTo((int) (landmarks.get(42).x * resizeRatio), (int) (landmarks.get(42).y * resizeRatio));
for (int i = 42 + 1; i < 48; i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path3.lineTo(pointX1, pointY1);
}
path3.close();
canvas.drawPath(path3, p);
path.reset();
path.moveTo((int) (landmarks.get(27).x * resizeRatio), (int) (landmarks.get(27).y * resizeRatio));
for (int i = 31; i < 36; i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
path.close();
canvas.drawPath(path, p);
path.reset();
path.moveTo((int) (landmarks.get(1).x * resizeRatio), (int) (landmarks.get(1).y * resizeRatio));
for (int i = 2; i < 17; i++) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
for (int i = 26; i > 16; i--) {
int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
path.lineTo(pointX1, pointY1);
}
path.close();
canvas.drawPath(path, p);
}