人脸识别的库
1、CoreImage
2、face++
3、OpenCV
4、libefacedetection
5、AV Foundation
6、vision
利用AVFoundation的人脸识别
1.视频采集
2.为session添加一个元数据输出.AVCaptureMetadataOutput
3.设置元数据的范围(人脸数据、二维码、一维码、、、)
4.开始捕捉(设置捕捉完成代理).didOutputMetadataObjects
5.获取捕捉到的人脸信息.代理方法中获取.didOutputMetadataObjects
6.对人脸数据进行处理
- (BOOL)setupSessionOutputs:(NSError **)error {
self.metadataOutput = [[AVCaptureMetadataOutput alloc]init];
//为捕捉会话添加设备
if ([self.captureSession canAddOutput:self.metadataOutput]){
[self.captureSession addOutput:self.metadataOutput];
//获得人脸属性
NSArray *metadatObjectTypes = @[AVMetadataObjectTypeFace];
//设置metadataObjectTypes 指定对象输出的元数据类型。
/*
限制检查到元数据类型集合的做法是一种优化处理方法。可以减少我们实际感兴趣的对象数量
支持多种元数据。这里只保留对人脸元数据感兴趣
*/
self.metadataOutput.metadataObjectTypes = metadatObjectTypes;
//创建主队列: 因为人脸检测用到了硬件加速,而且许多重要的任务都在主线程中执行,所以需要为这次参数指定主队列。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//通过设置AVCaptureVideoDataOutput的代理,就能获取捕获到一帧一帧数据
[self.metadataOutput setMetadataObjectsDelegate:self queue:mainQueue];
return YES;
}else
{
//报错
if (error) {
}
return NO;
}
}
//捕捉数据
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputMetadataObjects:(NSArray *)metadataObjects
fromConnection:(AVCaptureConnection *)connection {
//使用循环,打印人脸数据
for (AVMetadataFaceObject *face in metadataObjects) {
NSLog(@"Face detected with ID:%li",(long)face.faceID);
NSLog(@"Face bounds:%@",NSStringFromCGRect(face.bounds));
}
}
利用AVFoundation的二维码识别
CoreImage->CIDetector也能做二维码识别, CIFiter 生成二维码
二维码分类:
*QR码:移动营销
*Aztec码:登机牌
*PDF417:商品运输
(BOOL)setupSessionInputs:(NSError *__autoreleasing *)error {
//设置相机自动对焦,这样可以在任何距离都可以进行扫描。
BOOL success = [super setupSessionInputs:error];
if(success)
{
//判断是否能自动聚焦
if (self.activeCamera.autoFocusRangeRestrictionSupported) {
//锁定设备
if ([self.activeCamera lockForConfiguration:error]) {
//自动聚焦
/*
iOS 7.0新增属性 允许使用范围约束来对功能进行定制。
因为扫描条码,距离都比较近。所以AVCaptureAutoFocusRangeRestrictionNear,
通过缩小距离,来提高识别成功率。
*/
self.activeCamera.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;
//释放排他锁
[self.activeCamera unlockForConfiguration];
}
}
}
return YES;
}
- (BOOL)setupSessionOutputs:(NSError **)error {
//获取输出设备
self.metadataOutput = [[AVCaptureMetadataOutput alloc]init];
//判断是否能添加输出设备
if ([self.captureSession canAddOutput:self.metadataOutput]) {
//添加输出设备
[self.captureSession addOutput:self.metadataOutput];
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//设置委托代理
[self.metadataOutput setMetadataObjectsDelegate:self queue:mainQueue];
//指定扫描对是OR码 & Aztec 码 (移动营销)
NSArray *types = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeAztecCode,AVMetadataObjectTypeDataMatrixCode,AVMetadataObjectTypePDF417Code];
self.metadataOutput.metadataObjectTypes = types;
}else
{
return NO;
}
return YES;
}
//委托代理回掉。处理条码
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputMetadataObjects:(NSArray *)metadataObjects
fromConnection:(AVCaptureConnection *)connection {
if (metadataObjects.count > 0) {
NSLog(@"%@",metadataObjects[0]);
/*
<AVMetadataMachineReadableCodeObject: 0x17002db20, type="org.iso.QRCode", bounds={ 0.4,0.4 0.1x0.2 }>corners { 0.4,0.6 0.6,0.6 0.6,0.4 0.4,0.4 }, time 122373330766250, stringValue ""http://www.echargenet.com/portal/csService/html/app.html
*/
}
}