2017-08-29 49 views
0

我正在开发一款应用程序,其中显示了来自QR码的检测数据,但问题在于未检测到QR码。我已经使用此代码:CIDetector未检测到QR图像

NSDictionary *detectorOptions = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh }; 
       CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:detectorOptions]; 
       NSArray *features = [faceDetector featuresInImage:chosenImage.CIImage]; 
       CIQRCodeFeature *faceFeature; 
       for(faceFeature in features) 
       { 
        qrcodedetected = YES; 
        self.decodedstr = [NSString stringWithFormat:@"%@",faceFeature.messageString]; 
        break; 
       } 

我已经搜索了很多,但没有成功。我使用了Apple默认窗体中的这些代码。每次我都会得到零结果。如果有人对此有任何解决方案,请与我分享。这将不胜感激。提前致谢。

+0

为什么你不使用AVCaptureDevice.defaultDevice和AVCaptureSession读取QR码? – ObranS

+0

@ObranS:我不知道该怎么做。你有这方面的任何代码吗?谢谢你的努力。 – Vishal

+0

在下面添加,希望它能帮助你 – ObranS

回答

0
// initialize   
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; 

// create session 
AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; 
dispatch_queue_t dispatchQueue = dispatch_queue_create("QRCodeQueue", NULL); 
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; 
[captureMetadataOutput setMetadataObjectTypes:[captureMetadataOutput availableMetadataObjectTypes]]; 
[self.captureSession addOutput:captureMetadataOutput]; 

// add camera view layer 
AVCaptureVideoPreviewLayer *captureLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 
[captureLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
[captureLayer setFrame:self.view.layer.bounds]; 
[self.view.layer addSublayer:captureLayer]; 

// delegate method 
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { 

    // Specify the barcodes you want to read here: 
    NSArray *supportedBarcodeTypes = @[AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode]; 

    for (AVMetadataObject *barcodeMetadata in metadataObjects) { 
     for (NSString *supportedBarcode in supportedBarcodeTypes) { 
     if ([supportedBarcode isEqualToString:barcodeMetadata.type]) { 
      // get barcode object AVMetadataMachineReadableCodeObject 
      AVMetadataMachineReadableCodeObject *barcodeObject = (AVMetadataMachineReadableCodeObject *)[self.captureLayer transformedMetadataObjectForMetadataObject:barcodeMetadata]; 
      NSString *capturedBarcode = [barcodeObject stringValue]; 
      // do what you want... 
     } 
     } 
    } 
} 
+0

我在哪里传递我从图库中获得的图像?谢谢你的努力。 – Vishal

+0

我从图库中挑选了二维码图片,然后尝试解码它的信息。 – Vishal