2013-12-22 8 views
5

Ich arbeite derzeit mit AVCaptureSession und AVCaptureMetadataOutput.AVCaptureSession Barcode-Scan

Es funktioniert perfekt, aber ich möchte nur wissen, wie man Metadaten Objekte nur auf einer bestimmten Region der AVCaptureVideoPreviewLayer zu scannen und zu analysieren? Hier

Antwort

13

ist ein Beispiel von Code aus einem Projekt habe ich, dass Sie auf dem richtigen Weg helfen kann

// where 'self.session' is previously setup AVCaptureSession 

    // setup metadata capture 
    AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init]; 
    [self.session addOutput:metadataOutput]; 
    [metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
    [metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code]]; 

    // setup preview layer 
    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; 
    previewLayer.frame = self.previewView.bounds; 
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

    // we only want the visible area of the previewLayer to accept 
    // barcode input (ignore the rest) 
    // we need to convert rects coordinate system 
    CGRect visibleMetadataOutputRect = [previewLayer metadataOutputRectOfInterestForRect:previewLayer.bounds]; 
    metadataOutput.rectOfInterest = visibleMetadataOutputRect; 

    // add the previewLayer as a sublayer of the displaying UIView 
    [self.previewView.layer addSublayer:previewLayer]; 
+1

Ein Projekt: https: //github.com/jpwidmer/iOS7-BarcodeScanner –

+1

Dazu: [previewLayer metadataOutputRectOfInterestForRect: previewLayer.bounds] Das Ergebnis lautet: {{nan, nan}, {nan, nan}} –

+0

Beachten Sie, dass die Grenzen von previewLayer.frame aus self.previewView.bounds stammen (was einige zuvor instanziierte UIView sind). Sie sollten überprüfen, dass diese UIView Grenzen an diesem Punkt hat (z. B. verwenden Sie diesen Code vor Auto-Layout hat die Größe Ihrer Self.previewView ??) –

2

In iOS 9.3.2 hatte ich „CGAffineTransformInvert: singuläre Matrix“ Fehler beim metadataoutputRectOfInterestForRect Aufruf. Ich konnte es ihm gleich nach startRunning Methode der AVCaptureSession Aufruf funktioniert:

captureSession.startRunning() 
let visibleRect = previewLayer.metadataOutputRectOfInterestForRect(previewLayer.bounds) 
captureMetadataOutput.rectOfInterest = visibleRect 
Verwandte Themen