2013-11-25 2 views
2

그래서 QR 코드를 스캔하기 위해 AVCaptureMetadataOutput을 시도하고 있습니다. documented behaviorAVCaptureMetadataOutput, rectOfInterest outside 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

: 여기

Scans outside

코드 것 : 내가 가진 문제는 스캐닝 내가 rectOfInterest은 아래 이미지 참조 사용하더라도 미리보기 영역 외부에서 발생 할 수 있다는 것입니다

경계가 rectOfInterest와 교차하지 않는 메타 데이터 객체는 반환되지 않습니다.

따라서 QR 코드가 모두 사각형과 교차하면 감지됩니다.