1. 程式人生 > >iOS 開發技術之人臉識別

iOS 開發技術之人臉識別

前言

作為一名iOS開發人員,我覺得第一步是能夠基本模仿一個APP,完成別人APP的介面搭建;第二步,是儘量學會轉載,學習別人的部落格和技術;第三步,是學會原創,學著翻譯官方文件,而不是一味汲取別人消化好的食糧。

而我,尚在第一層。學習是個艱難的過程,自制力是壓力之一,愛好是催化劑,小有所成大概就是最好的鼓勵吧。

今天想轉載的技術是“人臉識別”···

說一下為什麼想學習這個。

可能自己真的很喜歡“產品”這個詞,出於一個iOS開發人員的基本素養,習慣去欣賞一個APP,習慣去剖析一個APP的基本構成和它最吸引人的一個或幾個功能。

市場上很多美圖類APP,大同小異,但是FaceU卻使我眼前一亮,它的特色在於人臉識別方面,雖然美妝類APP能夠識別人的五官進行美化,但是卻是靜態的,比如某秀出品的美妝相機,天天P圖的”瘋狂變裝”功能都是靜態的,需要照片出來之後後期加工上去的美瞳,妝面。

但是FaceU不同。

實時人臉識別,五官捕捉,然後加上動畫效果,可以錄小視訊,可以拍照,最重要的是還支援美顏、濾鏡,不用專業攝像頭,就可以自己做“主播”。

我經常用這款軟體哄小朋友,逗小孩子玩,以至於我的手機一大半都是小朋友照的美麗的或是帥氣的照片,在他們眼中的樂趣大概就是這樣:愛不釋手,樂到捧腹。

我想說的

我自認為一款好的APP是很少需要打廣告的,就像去別的地方旅行吃到那些蒼蠅小館的美食,會回來推薦給自己的朋友那種感覺一樣,是靠口碑。這款APP我不管是推薦還是朋友圈的隱性宣傳,數數也有很多人下載並使用了,一傳十,十傳百,就是這樣火起來。這就是好APP的魅力。

在北京的時間,發現好多小型創業公司,如雨後春筍長勢甚猛,可是網際網路的浪潮是否能夠推動創業者的成功還亟待觀察,這其中不少創業公司倒閉,小企業破產,網際網路的冬天似乎有點冷,但是還是有FaceU這樣的公司勢頭崛起,我想,實力和口碑就是創業公司最大的王牌吧。

希望所有創業公司能夠秉承最初的夢想,闖出一番自己的天地。

言歸正傳

因為FacuU的影響加之身邊有朋友工作是人臉識別類的APP的,所以想了解一下這個技術。

寫這篇部落格的目的就是分享人臉識別這項技術,當然不能遺忘。按慣例,首先附上原文地址,然後臭不要臉的複製貼上到自己的部落格來。哈哈哈,沒辦法,我還是iOS開發段位的第一層。

部落格正文

iOS的CoreImage已經內建了人臉檢測的介面,檢測準確率一般,尤其是側臉,基本上就檢測不到。不過跟其他同類產品比較,也還算是不相上下吧。用起來很簡單:

CIImage* image = [CIImage imageWithCGImage:aImage.CGImage];  

NSDictionary  *opts = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh  
                                              forKey:CIDetectorAccuracy];  

CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace  
                                      context:nil  
                                      options:opts];  

//得到面部資料  
NSArray* features = [detector featuresInImage:image];  

最後的features中就是檢測到的全部臉部資料,可以用如下方式計算位置:

for (CIFaceFeature *f in features)  
{  
CGRect aRect = f.bounds;         
 NSLog(@"%f, %f, %f, %f", aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height);  

 //眼睛和嘴的位置  
 if(f.hasLeftEyePosition) NSLog(@"Left eye %g %g\n", f.leftEyePosition.x, f.leftEyePosition.y);  
 if(f.hasRightEyePosition) NSLog(@"Right eye %g %g\n", f.rightEyePosition.x, f.rightEyePosition.y);  
 if(f.hasMouthPosition) NSLog(@"Mouth %g %g\n", f.mouthPosition.x, f.mouthPosition.y);  
 }  

照片檢測

注意,檢測到的位置是臉部資料在圖片上的座標(在UIImage上的,不是UIImageView上的),如果需要在檢視上繪製範圍,則需要進行座標轉換(y軸方向相反),並且也要注意圖片在檢視上的縮放等。

後話

之前做過濾鏡的demo,所以知道CoreImage,我感覺很強大,建議想了解的朋友可以找一下官方文件。(ps:找完請分享給我麼麼噠)