AVFoundation-高级捕捉之人脸识别和二维码识别

389 阅读1分钟

人脸识别Demo

二维码识别Demo

核心类

AVCaptureDevice音频或视频捕获设备

AVCaptureDeviceInput 提供从捕获设备到捕获会话的媒体

AVCaptureSession 捕获会话,管理捕获活动并连接输入到输出数据流

AVCaptureMetadataOutput用于处理元数据的捕获输出,例如人脸识别及二维码

第一步:初始化

1.创建AVCaptureSession并设置质量

self.captureSession = [[AVCaptureSession alloc] init];

self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;

2.创建视频输入设备及捕获媒体

AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:error];

3.添加视频输入捕获媒体

[self.captureSession addInput:videoInput];

4.创建捕获输出AVCaptureMetadataOutput并添加到当前会话

self.metadataOutput = [[AVCaptureMetadataOutput alloc] init];

[self.captureSession addOutput:self.metadataOutput];

5.设置metadataObjectTypes,这个属性用来区分捕获的类型,例如人脸识别和二维码

人脸识别:

self.metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeFace];

二维码:

**self**.metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,                                           AVMetadataObjectTypeAztecCode,                                          AVMetadataObjectTypeUPCECode]

6.设置AVCaptureMetadataOutputObjectsDelegate代理和捕获队列

[self.metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

第二步:启动会话

[self.captureSession startRunning];

第三步:创建预览图层,并设置AVCaptureSession会话

AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layer];

[layer setSession:session];

第四步:处理捕获的数据,通过如下的代理方法进行处理

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray< __kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection

我们需要的数据包含在metadataObjects数组里

如果是二维码,包含的是AVMetadataMachineReadableCodeObject类型,通过stringValue属性可以拿到我们想要的二维码数据

如果是人脸识别,包含的是AVMetadataFaceObject类型,通过faceID可以拿到人脸ID,通过bounds属性可以拿到人脸坐标,但是在这之前需要通过相机坐标和屏幕坐标的转换

如果我们需要获取到二维码或人脸识别结果的屏幕坐标,则需要通过AVCaptureVideoPreviewLayer的transformedMetadataObjectForMetadataObject方法进行坐标转换