2013-11-25 1 views
2

Так что я пытаюсь AVCaptureMetadataOutput для сканирования QR-кодов. У меня есть проблема в том, что сканирование может происходить за пределами области предварительного просмотра, даже если я использую rectOfInterest увидеть изображение ниже:AVCaptureMetadataOutput, rectOfInterest сканирует вне

Scans outside

Вот код:

- (void)capture 
{ 

session = [[AVCaptureSession alloc] init]; 
device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

if ([device lockForConfiguration:NULL] == YES) { 

    CGPoint point = CGPointMake(0.5,0.5); 
    [device setFocusPointOfInterest:point]; 
    [device setFocusMode:AVCaptureFocusModeContinuousAutoFocus]; 
    [device unlockForConfiguration]; 

} 

NSError *error = nil; 

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device 
                    error:&error]; 
if (!input) 
{ 
    NSLog(@"Error: %@", error); 
    return; 
} 

[session addInput:input]; 


//Add the metadata output device 
output = [[AVCaptureMetadataOutput alloc] init]; 
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
[session addOutput:output]; 

output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code]; 

output.rectOfInterest = self.livevideo.bounds; 

newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
newCaptureVideoPreviewLayer.frame = self.livevideo.bounds; 
newCaptureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
[self.livevideo.layer insertSublayer:newCaptureVideoPreviewLayer above:self.livevideo.layer]; 

highlightView = [[UIView alloc] init]; 
highlightView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin; 
highlightView.layer.borderColor = [UIColor greenColor].CGColor; 
highlightView.layer.borderWidth = 3; 
[self.livevideo addSubview:highlightView]; 

[session startRunning]; 

} 

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputMetadataObjects:(NSArray *)metadataObjects 
    fromConnection:(AVCaptureConnection *)connection 
{ 
AVMetadataMachineReadableCodeObject *barCodeObject; 
CGRect highlightViewRect = CGRectZero; 

for (AVMetadataObject *metadata in metadataObjects) 
{ 

    for (NSString *type in output.metadataObjectTypes) { 
     if ([metadata.type isEqualToString:type]) 
     { 

      barCodeObject = (AVMetadataMachineReadableCodeObject *)[newCaptureVideoPreviewLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata]; 

      highlightViewRect = barCodeObject.bounds; 
      @try { 
       NSString *code =[barCodeObject stringValue]; 
       NSLog(@"Read type: %@", type); 
       self.barcode.text = code; 
      } 
      @catch (NSException *exception) { 
       NSLog(@"%@", exception.reason); 
      } 

      break; 
     } 
    } 

} 

highlightView.frame = highlightViewRect; 
} 

ответ

1

Это documented behavior:

Объекты метаданных, границы которых не пересекаются с rectOfInterest, не возвращаются.

Итак, если QR-код на всех пересекает прямоугольник, он будет обнаружен.