您的位置:首页 > 移动开发 > IOS开发

iOS--iOS7摄像头识别二维码功能

2015-07-31 14:30 162 查看

iOS–iOS7摄像头识别二维码功能

属性介绍:


AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件。



AVCaptureDevice 是关于相机硬件的接口。它被用于控制硬件特性,诸如镜头的位置、曝光、闪光灯等。

AVCaptureDeviceInput 提供来自设备的数据。

AVCaptureOutput 是一个抽象类,描述 capture session 的结果。以下是三种关于静态图片捕捉的具体子类:

AVCaptureStillImageOutput 用于捕捉静态图片

AVCaptureMetadataOutput 启用检测人脸和二维码

AVCaptureVideoOutput 为实时预览图提供原始帧

AVCaptureSession 管理输入与输出之间的数据流,以及在出现问题时生成运行时错误。

AVCaptureVideoPreviewLayer 是 CALayer 的子类,可被用于自动显示相机产生的实时图像。它还有几个工具性质的方法,可将 layer 上的坐标转化到设备上。它看起来像输出,但其实不是。另外,它拥有 session (outputs 被 session 所拥有)。

设置属性:

@property (nonatomic, strong) AVCaptureSession *session;
@property (nonatomic, strong) AVCaptureDevice *device;
@property (nonatomic, strong) AVCaptureDeviceInput *input;
@property (nonatomic, strong) AVCaptureMetadataOutput *outPut;
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;


添加摄像头方法

/**
*  设置摄像头代码
*/
- (void)setupCamera{
//设备
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

//输入绑定设备
NSError *error;
_input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error];
if (error) {
return;
}

//输出
_outPut = [[AVCaptureMetadataOutput alloc]init];
[_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

//session
_session = [[AVCaptureSession alloc]init];
[_session setSessionPreset:AVCaptureSessionPresetHigh];  //设置画面采集的质量
if ([_session canAddInput:_input]) {
[_session addInput:_input];
}
if ([_session canAddOutput:_outPut]) {
[_session addOutput:_outPut];
}

//一定要先设置session的输出为output之后,再指定输出的元数据类型为二维码类型!
[_outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

//预览图层
_previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];
//    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;   //preview图层的属性,使视图形状为屏幕大小形状
_previewLayer.frame = self.view.frame;//preview图层的大小
[self.view.layer insertSublayer:_previewLayer atIndex:0]; //将图层添加到视图的图层

//开始运行
[_session startRunning];
}


注意output中设置了一个delegate,我们需要怎么这个协议,然后在下面的代码中设置

[_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]


协议的实现部分如下:

#pragma mark - AVCaptureMetadataOutputObjectsDelegate
// 在完成二维码解码时,调用
// 如果QRCode的内容越大,转换需要的时间就越长
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{

NSString *stringValue;
if ([metadataObjects count] >0)
{
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
stringValue = metadataObject.stringValue;
}

NSLog(@"%@",stringValue);
//获取扫描数据,结束编辑
[_session stopRunning];
[self dismissViewControllerAnimated:YES completion:nil];
}


二维码生成网站,测试时可使用

http://cli.im/text?text053e86238125abe22dd1474278f5855d
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: