人臉識(shí)別技術(shù) (一) —— 基于CoreImage實(shí)現(xiàn)對(duì)靜止圖片中人臉的識(shí)別

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.01.31

前言

人臉識(shí)別是圖像識(shí)別技術(shù)中的一種啊易,廣泛的應(yīng)用于很多領(lǐng)域烁涌,接下來(lái)這幾篇我們就一起來(lái)研究幾種關(guān)于人臉識(shí)別的技術(shù)趾徽。

基于CoreImage的人臉識(shí)別技術(shù)

CoreImage是蘋果提供的原生API侧巨,它有人臉識(shí)別的接口沃缘,可以實(shí)現(xiàn)人臉的識(shí)別躯枢,支持對(duì)圖像中多個(gè)人臉的識(shí)別。


代碼實(shí)現(xiàn)

下面我們一起看一下代碼槐臀。

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) UIImageView *pictureImageView;

@end

@implementation ViewController

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self initUI];
    [self detectFaceWithImage];
}

#pragma mark - Object Private Function

- (void)initUI
{
    UIImageView *pictureImageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    pictureImageView.contentMode = UIViewContentModeScaleAspectFit;
    pictureImageView.image = [UIImage imageNamed:@"face"];
    self.pictureImageView = pictureImageView;
    [self.view addSubview:pictureImageView];
}

- (void)detectFaceWithImage
{
    UIImage *image = [UIImage imageNamed:@"face"];
    // 圖像識(shí)別能力:可以在CIDetectorAccuracyHigh(較強(qiáng)的處理能力)與CIDetectorAccuracyLow(較弱的處理能力)中選擇锄蹂,因?yàn)橄胱寽?zhǔn)確度高一些在這里選擇CIDetectorAccuracyHigh
    NSDictionary *opts = [NSDictionary dictionaryWithObject:
                          CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
    // 將圖像轉(zhuǎn)換為CIImage
    CIImage *faceImage = [CIImage imageWithCGImage:image.CGImage];
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:opts];
    // 識(shí)別出人臉數(shù)組
    NSArray *features = [faceDetector featuresInImage:faceImage];
    // 得到圖片的尺寸
    CGSize inputImageSize = [faceImage extent].size;
    //將image沿y軸對(duì)稱
    CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, -1);
    //將圖片上移
    transform = CGAffineTransformTranslate(transform, 0, -inputImageSize.height);
    
    // 取出所有人臉
    for (CIFaceFeature *faceFeature in features){
        //獲取人臉的frame
        CGRect faceViewBounds = CGRectApplyAffineTransform(faceFeature.bounds, transform);
        CGSize viewSize = self.pictureImageView.bounds.size;
        CGFloat scale = MIN(viewSize.width / inputImageSize.width,
                            viewSize.height / inputImageSize.height);
        CGFloat offsetX = (viewSize.width - inputImageSize.width * scale) / 2;
        CGFloat offsetY = (viewSize.height - inputImageSize.height * scale) / 2;
        // 縮放
        CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scale, scale);
        // 修正
        faceViewBounds = CGRectApplyAffineTransform(faceViewBounds,scaleTransform);
        faceViewBounds.origin.x += offsetX;
        faceViewBounds.origin.y += offsetY;
        
        //描繪人臉區(qū)域
        UIView* faceView = [[UIView alloc] initWithFrame:faceViewBounds];
        faceView.layer.borderWidth = 2;
        faceView.layer.borderColor = [[UIColor redColor] CGColor];
        [self.pictureImageView addSubview:faceView];
        
        // 判斷是否有左眼位置
        if(faceFeature.hasLeftEyePosition){
            NSLog(@"檢測(cè)到左眼");
        }
        // 判斷是否有右眼位置
        if(faceFeature.hasRightEyePosition){
            NSLog(@"檢測(cè)到右眼");
        }
        // 判斷是否有嘴位置
        if(faceFeature.hasMouthPosition){
            NSLog(@"檢測(cè)到嘴部");
        }
    }
}

@end

下面我們看一下輸出結(jié)果

2018-01-30 23:27:22.402634+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到左眼
2018-01-30 23:27:22.402767+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到右眼
2018-01-30 23:27:22.402811+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到嘴部

2018-01-30 23:27:22.402992+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到左眼
2018-01-30 23:27:22.403023+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到右眼
2018-01-30 23:27:22.403136+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到嘴部

2018-01-30 23:27:22.403321+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到左眼
2018-01-30 23:27:22.403364+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到右眼
2018-01-30 23:27:22.403393+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到嘴部

2018-01-30 23:27:22.403466+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到左眼
2018-01-30 23:27:22.403494+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到右眼
2018-01-30 23:27:22.403520+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到嘴部

2018-01-30 23:27:22.403590+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到左眼
2018-01-30 23:27:22.403617+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到右眼
2018-01-30 23:27:22.403641+0800 JJFaceDetector_demo1[4535:1334965] 檢測(cè)到嘴部

實(shí)現(xiàn)效果

接著看一下識(shí)別效果

可見(jiàn),可以精確的識(shí)別出所有的人臉水慨。

這里有幾點(diǎn)需要注意:

  • UIView坐標(biāo)系和CoreImage坐標(biāo)系不一樣得糜,UIView原點(diǎn)是左上角,CoreImage是左下角晰洒。所以需要使用仿射變換(AffineTransform)將Core Image坐標(biāo)轉(zhuǎn)換為UIKit坐標(biāo)朝抖。
//y軸對(duì)稱
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, -1);
//上移
transform = CGAffineTransformTranslate(transform, 0, -inputImageSize.height);

后記

本篇已結(jié)束,后面更精彩~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谍珊,一起剝皮案震驚了整個(gè)濱河市治宣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖侮邀,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坏怪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绊茧,警方通過(guò)查閱死者的電腦和手機(jī)铝宵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)按傅,“玉大人捉超,你說(shuō)我怎么就攤上這事∥ㄉ埽” “怎么了拼岳?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)况芒。 經(jīng)常有香客問(wèn)我惜纸,道長(zhǎng),這世上最難降的妖魔是什么绝骚? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任耐版,我火速辦了婚禮,結(jié)果婚禮上压汪,老公的妹妹穿的比我還像新娘粪牲。我一直安慰自己,他們只是感情好止剖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布腺阳。 她就那樣靜靜地躺著,像睡著了一般穿香。 火紅的嫁衣襯著肌膚如雪亭引。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天皮获,我揣著相機(jī)與錄音焙蚓,去河邊找鬼。 笑死洒宝,一個(gè)胖子當(dāng)著我的面吹牛购公,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雁歌,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宏浩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了将宪?” 一聲冷哼從身側(cè)響起绘闷,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎较坛,沒(méi)想到半個(gè)月后印蔗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丑勤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年华嘹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片法竞。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耙厚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岔霸,到底是詐尸還是另有隱情薛躬,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布呆细,位于F島的核電站型宝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏絮爷。R本人自食惡果不足惜趴酣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坑夯。 院中可真熱鬧岖寞,春花似錦、人聲如沸柜蜈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跨释。三九已至胸私,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳖谈,已是汗流浹背岁疼。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缆娃,地道東北人捷绒。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贯要,于是被迫代替她去往敵國(guó)和親暖侨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容