Xcode AVCapturesession扫描特定帧中的条形码(rectOfInterest不起作用)

我正试图为我目前正在使用的应用程序devise一款条形码扫描器。 我希望扫描仪预览填充设备的整个屏幕,并提供一个更小的框架指向条形码。 所有的工作是如何我想要的,但我不能得到的利益框架的工作。

这里是条码扫描器的实现:

#import "GEScannerViewController.h" @import AVFoundation; @interface GEScannerViewController () <AVCaptureMetadataOutputObjectsDelegate> { AVCaptureSession *_session; AVCaptureDevice *_device; AVCaptureDeviceInput *_input; AVCaptureMetadataOutput *_output; AVCaptureVideoPreviewLayer *_prevLayer; UIView *_greyView; UIView *_highlightView; UIView *_scopeView; UILabel *_label; } @end @implementation GEScannerViewController - (void)viewDidLoad { [super viewDidLoad]; _label = [[UILabel alloc] init]; _label.frame = CGRectMake(0, self.view.bounds.size.height - 40, self.view.bounds.size.width, 40); _label.autoresizingMask = UIViewAutoresizingFlexibleTopMargin; _label.backgroundColor = [UIColor colorWithWhite:0.15 alpha:0.65]; _label.textColor = [UIColor whiteColor]; _label.textAlignment = NSTextAlignmentCenter; _label.text = @"(none)"; [self.view addSubview:_label]; NSError *error = nil; _session = [[AVCaptureSession alloc] init]; _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; [_device lockForConfiguration:&error]; if (error) { NSLog(@"Error: %@", error); } _device.focusPointOfInterest = CGPointMake(self.view.frame.size.width / 2, (self.view.frame.size.height / 2) - 80); _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error]; if (_input) { [_session addInput:_input]; } else { NSLog(@"Error: %@", error); } _output = [[AVCaptureMetadataOutput alloc] init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; _output.rectOfInterest = CGRectMake((self.view.frame.size.width / 2) - 160, (self.view.frame.size.height / 2) - 160, 320, 160); [_session addOutput:_output]; _output.metadataObjectTypes = [_output availableMetadataObjectTypes]; _prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session]; _prevLayer.frame = self.view.bounds; _prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; [self.view.layer addSublayer:_prevLayer]; _greyView = [[UIView alloc] initWithFrame:self.view.frame]; _greyView.bounds = self.view.bounds; _greyView.backgroundColor = [UIColor colorWithWhite:0.15 alpha:0.65]; [self.view.layer addSublayer:_greyView.layer]; _scopeView = [[UIView alloc] initWithFrame:CGRectMake((self.view.frame.size.width / 2) - 160, (self.view.frame.size.height / 2) - 160, 320, 160)]; _scopeView.backgroundColor = [UIColor clearColor]; _scopeView.layer.borderColor = [UIColor greenColor].CGColor; _scopeView.layer.borderWidth = 1; _scopeView.clipsToBounds = YES; [self.view addSubview:_scopeView]; _highlightView = [[UIView alloc] init]; _highlightView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin; _highlightView.layer.borderColor = [UIColor greenColor].CGColor; _highlightView.layer.borderWidth = 3; [_scopeView addSubview:_highlightView]; [_session startRunning]; [self.view bringSubviewToFront:_highlightView]; [self.view bringSubviewToFront:_label]; } 

我正在使用_output.rectOfInterest指定框架与_scopeView的框架相同。 不幸的是,这是行不通的。 如果我这样做,没有条码被认可了。

只要我得到它,它是绝对明确的:

AVCaptureMetadataOutput由像素定义,因此要将显示的坐标映射到输出中的坐标,我必须使用metadataOutputRectOfInterestForRect:

 From AVCaptureOutput.h: /*! @method metadataOutputRectOfInterestForRect: @abstract Converts a rectangle in the receiver's coordinate space to a rectangle of interest in the coordinate space of an AVCaptureMetadataOutput whose capture device is providing input to the receiver. @param rectInOutputCoordinates A CGRect in the receiver's coordinates. @result A CGRect in the coordinate space of the metadata output whose capture device is providing input to the receiver. @discussion AVCaptureMetadataOutput rectOfInterest is expressed as a CGRect where {0,0} represents the top left of the picture area, and {1,1} represents the bottom right on an unrotated picture. This convenience method converts a rectangle in the coordinate space of the receiver to a rectangle of interest in the coordinate space of an AVCaptureMetadataOutput whose AVCaptureDevice is providing input to the receiver. The conversion takes orientation, mirroring, and scaling into consideration. See -transformedMetadataObjectForMetadataObject:connection: for a full discussion of how orientation and mirroring are applied to sample buffers passing through the output. */ - (CGRect)metadataOutputRectOfInterestForRect:(CGRect)rectInOutputCoordinates NS_AVAILABLE_IOS(7_0); 

使用此设置rectOfInterest它的工作。