在这里插入图片描述
//振动,颤动,摆动
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);// // 播放一下“拍照”的声音,模拟拍照 AudioServicesPlaySystemSound(1108);
//
- (BOOL)canSwitchCameras {
return [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count] > 1;
}
实现输出流的代理AVCaptureMetadataOutputObjectsDelegate
_metadataOutput = [[AVCaptureMetadataOutput alloc]init];
[_metadataOutput setMetadataObjectsDelegate:self queue:self.queue];
[self.videoDataOutput setSampleBufferDelegate:nil queue:self.queue];
// 检测人脸是为了获得“人脸区域”,做“人脸区域”与“身份证人像框”的区域对比,当前者在后者范围内的时候,才能截取到完整的身份证图像
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
if (metadataObjects.count) {
AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;
AVMetadataObject *transformedMetadataObject = [self.previewLayer transformedMetadataObjectForMetadataObject:metadataObject];
CGRect faceRegion = transformedMetadataObject.bounds;
if (metadataObject.type == AVMetadataObjectTypeFace) {
NSLog(@"是否包含头像:%d, facePathRect: %@, faceRegion: %@",CGRectContainsRect(self.faceDetectionFrame, faceRegion),NSStringFromCGRect(self.faceDetectionFrame),NSStringFromCGRect(faceRegion));
if (CGRectContainsRect(self.faceDetectionFrame, faceRegion)) {// 只有当人脸区域的确在小框内时,才再去做捕获此时的这一帧图像
// 为videoDataOutput设置代理,程序就会自动调用下面的代理方法,捕获每一帧图像
if (!self.videoDataOutput.sampleBufferDelegate) {
[self.videoDataOutput setSampleBufferDelegate:self queue:self.queue];
}
}
}
}
}
设置代理
_videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
[self.videoDataOutput setSampleBufferDelegate:self queue:self.queue];
从输出的数据流捕捉单一的图像帧
#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate
#pragma mark 从输出的数据流捕捉单一的图像帧
// AVCaptureVideoDataOutput获取实时图像,这个代理方法的回调频率很快,几乎与手机屏幕的刷新频率一样快
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
if ([self.outPutSetting isEqualToNumber:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]] || [self.outPutSetting isEqualToNumber:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange]]) {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
if ([captureOutput isEqual:self.videoDataOutput]) {
// 身份证信息识别 +(void)iDCardRecognit:(CVImageBufferRef)imageBuffer WithstopRunningBlcok:(void(^)(id make)) stopRunningBlcok finishBlock:(k_finishBlock)finishBlock;
__weak __typeof__(self) weakSelf = self;
[KNScanCardManage iDCardRecognit:imageBuffer WithstopRunningBlcok:^(id _Nonnull sender) {
if ([weakSelf.session isRunning]) {
[weakSelf.session stopRunning];
}
} finishBlock:weakSelf.finishBlock];//imageBuffer
// 身份证信息识别完毕后,就将videoDataOutput的代理去掉,防止频繁调用AVCaptureVideoDataOutputSampleBufferDelegate方法而引起的“混乱”
if (self.videoDataOutput.sampleBufferDelegate) {
[self.videoDataOutput setSampleBufferDelegate:nil queue:self.queue];
}
}
} else {
NSLog(@"输出格式不支持");
}
}
监听点击事件
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(focusGesture:)];
[self.view addGestureRecognizer:tapGesture];
点击屏幕对焦
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有