2015-03-13 30 views
3

我已经运送了一段时间的应用程序,使用AVFoundation Framwork读取驱动程序的许可证上的PDF417条形码以捕获数据。与许多不同的州司机的执照很好地合作。但是,我一直无法从马里兰州读取任何许可证。我的应用程序还可以使用霍尼韦尔的可选附件或使用激光扫描仪读取条形码的无限外设。这些附件能够轻松阅读相同的马里兰条形码。AVMetadataObjectTypePDF417Code无法读取马里兰州驾驶执照

发生的事情是回调到:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection 

但在美国马里兰州执照扫描条形码时不会发生回调。它适用于我迄今尝试的任何其他州牌照。我还没有任何其他州颁发的许可证的问题,但我还没有尝试过。

有其他人看过这个问题吗?

更新:这不是一个关于如何使用AVFoundation框架来读取条形码的问题。我在应用商店中有多种产品,包括PDF417代码。而有关条形码绝对是PDF417条形码,因为美国要求所有50个州和波多黎各在其许可证上放置PDF417条形码。

最终状态: 我能够扫描MD许可证。事实证明,它们包含的数据比我一直在使用的其他许可证格式要多得多。因此,使用相机扫描它们需要更好的照明和比其他密度较低的条码更稳定的手。它可以完成并且工作。我决定留下这个问题,以便任何有此问题的人都可以看到下面发布的解决方案,并且可以理解这是可能的。

+1

MD dl/id的有效样本在哪里? – 2015-03-16 00:19:42

+0

@BradBrighton我从某人的实际许可中获得条形码。我无法分享,原因很明显。我想我只是问是否有其他人看过这个问题,以及他们是否以及如何能够克服它。我的产品能够识别许多不同州许可证上的条形码,但OP中提到的API并不能识别我尝试过的马里兰州许可证上的条形码。 – 2015-03-16 03:43:39

+0

当然,你不能分享真正的许可证。但是,如果有正式的样本,您可以确定是否是许可证或州标准给您带来问题。我也有多种状态的代码,但是MD还不是我所知道的,并且相关的标准对于兼容性非常明确。 – 2015-03-16 03:46:06

回答

3

我可以使用下面的代码成功扫描PDF417代码。

编辑:追查一个样本MD许可证后,我确实可以使用AVCapture成功扫描它,但只能在Photoshop中编辑图像后才能成功扫描。

-(void)setupBarcode 
{ 
    AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    NSError *error = nil; 

    _input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 
    [self.captureSession addInput:_input]; 

    _output = [[AVCaptureMetadataOutput alloc] init]; 
    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
    [self.captureSession addOutput:_output]; 

    _output.metadataObjectTypes = [_output availableMetadataObjectTypes]; 
    self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; 
} 

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection 
{ 
    AVMetadataMachineReadableCodeObject *barCodeObject; 
    NSString *detectionString = nil; 
    for (AVMetadataObject *metadata in metadataObjects) 
    { 
     if ([metadata.type isEqualToString:AVMetadataObjectTypePDF417Code]) 
     { 
      barCodeObject = (AVMetadataMachineReadableCodeObject *)[self.previewLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata]; 
      detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue]; 
      break; 
     } 
     else 
     { 
      //What do you get for this line if it doesn't decode? 
      NSLog(@"%@",metadata.type); 
     } 
    } 
    NSLog(@"%@",detectionString); 
} 

为了获得MD许可证扫描正常,我不得不进口许可证到Photoshop的图像,调整对比度,分辨率和抗锯齿,然后它完美扫描,回到了我正确的字符串与所有适当的驾驶执照字段。

我相信这是由于相机的分辨率与打印的DL的分辨率相结合。某些字段(如左行指示符)未被清晰地读取。

+0

根据霍尼韦尔和无限外设附件的结果,这是一个PDF417条形码,这些设备能够扫描它。正如我对@Brad所说的那样,我一直这样做了一段时间,并成功扫描了iOS 7发布后很快发布的产品中的条形码。我的代码也可以。但是,我从来没有从AVLoundation框架回复马里兰州的特定条形码。这不是我的代码,它是由于某种原因未能识别它的框架。 – 2015-03-21 02:59:33

+0

所有美国和加拿大驾驶执照都使用PDF417条形码。请参阅http://www.aamva.org/Driver-Licensing-Identification/条形码绝对是PDF417,但可能有一些与苹果图书馆无法解释的规格有关的变体。 PDF417的规范非常复杂,包括纠错和其他可能导致此类问题的参数的选择。 – 2015-03-23 02:09:31

+1

@ChuckKrutsinger唯一的另一件事是条形码可能对于相机来说很大,如果它有很多字符,iPhones相机可能不具有识别像素所需的分辨率。我能够复制这里列出的问题,在那里我无法扫描第一个PDF417,直到它被重新扫描,然后扫描得很好。 https://github.com/PDF417/pdf417-android/issues/1 – zimmryan 2015-03-23 14:18:30