人臉捕捉

首先通過(guò)#import <AVFoundation/AVFoundation.h> 捕捉手機(jī)屏幕圖像住涉。
主要代碼:

@interface ViewController ()<AVCaptureVideoDataOutputSampleBufferDelegate>
//硬件設(shè)備
@property (nonatomic, strong) AVCaptureDevice *device;
//輸入流
@property (nonatomic, strong) AVCaptureDeviceInput *input;
//協(xié)調(diào)輸入輸出流的數(shù)據(jù)
@property (nonatomic, strong) AVCaptureSession *session;
//預(yù)覽層
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
//輸出流
@property (nonatomic, strong) AVCaptureVideoDataOutput *videoDataOutput;

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view.layer addSublayer:self.previewLayer];
    [self.session startRunning];
}
#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate
//AVCaptureVideoDataOutput獲取實(shí)時(shí)圖像俄占,這個(gè)代理方法的回調(diào)頻率很快腔长,幾乎與手機(jī)屏幕的刷新頻率一樣快
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{
    //設(shè)置圖像方向辐烂,否則largeImage取出來(lái)是反的
    [connection setVideoOrientation:AVCaptureVideoOrientationPortrait];
    //獲取圖像圖片(使用下面人臉捕捉代碼即可)   
 largeImage = [self imageFromSampleBuffer:sampleBuffer];
}

//CMSampleBufferRef轉(zhuǎn)NSImage
-(UIImage *)imageFromSampleBuffer:(CMSampleBufferRef)sampleBuffer{
    // 為媒體數(shù)據(jù)設(shè)置一個(gè)CMSampleBuffer的Core Video圖像緩存對(duì)象
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    // 鎖定pixel buffer的基地址
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    // 得到pixel buffer的基地址
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
    // 得到pixel buffer的行字節(jié)數(shù)
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    // 得到pixel buffer的寬和高
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    // 創(chuàng)建一個(gè)依賴于設(shè)備的RGB顏色空間
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    // 用抽樣緩存的數(shù)據(jù)創(chuàng)建一個(gè)位圖格式的圖形上下文(graphics context)對(duì)象
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    // 根據(jù)這個(gè)位圖context中的像素?cái)?shù)據(jù)創(chuàng)建一個(gè)Quartz image對(duì)象
    CGImageRef quartzImage = CGBitmapContextCreateImage(context);
    // 解鎖pixel buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    // 釋放context和顏色空間
    CGContextRelease(context); CGColorSpaceRelease(colorSpace);
    // 用Quartz image創(chuàng)建一個(gè)UIImage對(duì)象image
    UIImage *image = [UIImage imageWithCGImage:quartzImage];
    // 釋放Quartz image對(duì)象
    CGImageRelease(quartzImage);
    return (image);
}


-(AVCaptureDeviceInput *)input{
    if (_input == nil) {
        _input = [[AVCaptureDeviceInput alloc] initWithDevice:self.device error:nil];
    }
    return _input;
}


-(AVCaptureVideoDataOutput *)videoDataOutput{
    if (_videoDataOutput == nil) {
        _videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
        [_videoDataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
        //設(shè)置像素格式遏插,否則CMSampleBufferRef轉(zhuǎn)換NSImage的時(shí)候CGContextRef初始化會(huì)出問(wèn)題
        [_videoDataOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
    }
    return _videoDataOutput;
}

-(AVCaptureSession *)session{
    if (_session == nil) {
        _session = [[AVCaptureSession alloc] init];
        if ([_session canAddInput:self.input]) {
            [_session addInput:self.input];
        }
        if ([_session canAddOutput:self.videoDataOutput]) {
            [_session addOutput:self.videoDataOutput];
        }
    }
    return _session;
}

-(AVCaptureVideoPreviewLayer *)previewLayer{
    if (_previewLayer == nil) {
        _previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];
        _previewLayer.frame = self.view.layer.bounds;
    }
    return _previewLayer;
}

主要使用#import <CoreImage/CoreImage.h>框架捕捉,簡(jiǎn)單代碼如下

// 圖像識(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 options: [NSDictionary dictionaryWithObject:@(5) forKey:CIDetectorImageOrientation]];

iOS技術(shù)群

iOS開(kāi)發(fā)交流群群二維碼.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胳嘲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扣草,更是在濱河造成了極大的恐慌了牛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辰妙,死亡現(xiàn)場(chǎng)離奇詭異鹰祸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)密浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蛙婴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尔破,你說(shuō)我怎么就攤上這事街图〗匠模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵餐济,是天一觀的道長(zhǎng)耘擂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)絮姆,這世上最難降的妖魔是什么醉冤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮篙悯,結(jié)果婚禮上蚁阳,老公的妹妹穿的比我還像新娘。我一直安慰自己辕近,他們只是感情好韵吨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著移宅,像睡著了一般归粉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漏峰,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天糠悼,我揣著相機(jī)與錄音,去河邊找鬼浅乔。 笑死倔喂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靖苇。 我是一名探鬼主播席噩,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贤壁!你這毒婦竟也來(lái)了悼枢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脾拆,失蹤者是張志新(化名)和其女友劉穎馒索,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體名船,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绰上,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渠驼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈块。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疯趟,到底是詐尸還是另有隱情拘哨,我是刑警寧澤谋梭,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布信峻,位于F島的核電站,受9級(jí)特大地震影響瓮床,放射性物質(zhì)發(fā)生泄漏盹舞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一隘庄、第九天 我趴在偏房一處隱蔽的房頂上張望踢步。 院中可真熱鬧,春花似錦丑掺、人聲如沸获印。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兼丰。三九已至,卻和暖如春唆缴,著一層夾襖步出監(jiān)牢的瞬間鳍征,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工面徽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艳丛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓趟紊,卻偏偏與公主長(zhǎng)得像氮双,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霎匈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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