1. 程式人生 > >我用PHP影象技術做了一個有趣的貼鬍子程式,準確率達到98%

我用PHP影象技術做了一個有趣的貼鬍子程式,準確率達到98%

http://blog.jobbole.com/89526/

最近微軟推出的年齡識別軟體可謂是火爆了朋友圈,聽說好像是通過識別臉上皺紋來判斷年齡的,而我,通過抓取知乎100萬用戶也小小火了一把,於是我想繼續發掘PHP的潛能,看看有沒有更多的可能性,做一個有趣的東西出來。別人識別年齡、美顏、變老,我要不貼貼鬍子試試?!於是,PHP的貼鬍子程式就開始了……

要給臉上貼鬍子,首先當然得把臉找出來,於是我找到了opencv,一個開源的人臉識別類庫,還有PHP擴充套件,聽說國內那些android上面的人臉識別,都是用這個搞的。。。

先來試試識別人臉,用的是 haarcascade_frontalface_alt.xml 配置檔案

PHPArray ( [0] => Array ( [x] => 115 [y] => 190 [w] => 278 [h] => 278 ) )
1Array([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套鬍子,想不想看看這些鬍子的表現如何?

不得不說,一個男人擁有了鬍子,更加性感迷人有木有,如果可以每天和換衣服一樣換鬍子,豈不是美哉?

好吧如果你以為這就完了,那你就錯了,再好的技術也少不了包裝,於是,我給這個程式穿上了一件華麗的衣衫。。。

好吧,軟體到這裡就設計完了,有興趣的朋友可以上去玩玩,看看能匹配出什麼樣的鬍子來哈,忘了說現在鬍子是隨機的,後面我們改進演算法,給不同臉型的人不同的鬍子匹配,覺得好玩的幫忙轉發微信朋友圈。。。^_^