我用PHP图像技术做了一个有趣的贴胡子程序,准确率达到98%

最近微软推出的年龄识别软件可谓是火爆了朋友圈,听说好像是通过识别脸上皱纹来判断年龄的,而我,通过抓取知乎100万用户也小小火了一把,于是我想继续发掘PHP的潜能,看看有没有更多的可能性,做一个有趣的东西出来。别人识别年龄、美颜、变老,我要不贴贴胡子试试?!于是,PHP的贴胡子程序就开始了……

要给脸上贴胡子,首先当然得把脸找出来,于是我找到了opencv,一个开源的人脸识别类库,还有PHP扩展,听说国内那些android上面的人脸识别,都是用这个搞的。。。

先来试试识别人脸,用的是 haarcascade_frontalface_alt.xml 配置文件

Array ( [0] => Array ( [x] => 115 [y] => 190 [w] => 278 [h] => 278 ) )

不错,人脸一下子就识别出来了,但是这样也太不雅观了,把这些数字变成线条试试:

接下来看看鼻子,用的是 haarcascade_mcs_nose.xml 配置文件

不得不说小猪的脸长得是够标致的,一下就识别出鼻子来了,不信我们来试试范爷的脸:

看范爷这张比较标致的脸,都能找出3个鼻子来,更别说我这种能找出5个鼻子的脸了~_~

再来看看嘴巴,用的是 haarcascade_mcs_mouth.xml 配置文件

 

好吧我承认 opencv 真的弱爆了,小猪居然有8个嘴巴,范爷有18个,他两是妖精么?!

不得不说,opencv 如果单单这么用,真的是完全没法用,所以接下来才是重点,我要把真正的鼻子和嘴巴找出来,然后在他们中间贴上胡子,为了完成这艰巨的任务,我采用了排除法。。。^_^

首先鼻子的中线应该离得脸的中线最近,于是我们要先算出脸和鼻子的中线来,这样看貌似又很难看得出数值,于是我把调试模式再次升级。。。

嘿嘿,是不是有种黑客帝国的感觉^_^

经过计算排除,我们最终得到了范爷准确的脸和鼻子

接下来是嘴巴,范爷有18个嘴巴而小猪有8个

 

这毛毛多得嘴巴啊,看着都吓人,好吧说说我的算法把,排除嘴巴的算法是这样的:

1、脸蛋上边、左上角、上边的嘴巴排除掉

2、超出脸蛋下边的嘴巴排除掉

3、超出脸蛋右边的嘴巴排除掉

4、最左边和最右边已经超过鼻子的中间竖线了的排除

5、最上边已经超过鼻子的中间横线了的排除掉

6、鼻子上边的嘴巴排除

7、下边线已经在脸以下了的排除掉

经过这几部算法以后,我们准确的得到了小猪和范爷的脸蛋、鼻子、嘴巴

 

哈哈是不是干净多了,接下来是重点了,贴胡子。。。

贴胡子的思路是这样的,找到鼻子和嘴巴的中间线,计算出胡子的中间线从而推导胡子的Y轴坐标,以鼻子的X轴坐标作为胡子的X轴坐标,当然如果你歪鼻子或者歪嘴巴的话,那还是不要贴了吧^_^,好吧下面是算法:

1、获得胡子的宽高

2、以嘴巴的1.8倍宽为胡子的宽度,为什么是1.8倍?因为我试了100个胡子,觉得1.8倍是最合适的呀^_^

3、缩放胡子图片大小

4、计算胡子坐标:

X轴坐标 = 鼻子的X轴坐标 – 胡子宽度 / 2;

鼻子到嘴巴的中间坐标 = 鼻子的中间坐标 + ( 嘴巴的中间坐标 – 鼻子的中间坐标 ) / 2

Y轴坐标 = 鼻子到嘴巴的中间坐标 – 缩放后的胡子高度 / 2;

5、贴上胡子,大功告成!!!

 

接下来我们把烦人的调试信息去掉。。。

 

是不是很酷哈,当然聪明的你可能早已发现,他两的胡子不一样?!对了,这才是重点,为了逗你们开心,我做了100套胡子,想不想看看这些胡子的表现如何?

不得不说,一个男人拥有了胡子,更加性感迷人有木有,如果可以每天和换衣服一样换胡子,岂不是美哉?

好吧如果你以为这就完了,那你就错了,再好的技术也少不了包装,于是,我给这个程序穿上了一件华丽的衣衫。。。

好吧,软件到这里就设计完了,有兴趣的朋友可以上去玩玩,看看能匹配出什么样的胡子来哈,忘了说现在胡子是随机的,后面我们改进算法,给不同脸型的人不同的胡子匹配,觉得好玩的帮忙转发微信朋友圈。。。^_^

本文文字及图片出自 伯乐在线

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注