【问题标题】:Using CIDetector to scan bar Codes (1 and 2 dimentional)使用 CIDetector 扫描条码(一维和二维)
【发布时间】:2017-05-04 13:17:59
【问题描述】:

我想从实时摄像头和图像中扫描二维码和条形码。我之前使用 ZBar 库来扫描代码。它不扫描特定类型的二维码和条形码。此外,在从实时摄像头扫描代码时,Apple 的 AVFoundation 框架似乎更加快速和准确。

所以我不想使用 ZBar。为了从从图库中挑选的图像中扫描代码,我使用了 CIDetector。但似乎 CIDetector 无法从图像中扫描条形码。我已经在整个堆栈中搜索了流CIDetector For other Barcode TypesScanning barcode from UIImage natively (i.e., not using ZBar)

但我还没有找到一种方法来使用 CIDetector 扫描从画廊中挑选的图像中的条形码。是否可以使用 CIDetector 从 UIImage 中扫描条形码?

不推荐其他第三方库。我想使用苹果的默认框架来完成这项工作。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{

     [picker dismissViewControllerAnimated:YES completion:nil];

     UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
     CIImage *img = [[CIImage alloc]initWithImage:image];

     CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
     if (detector) 
    {
        NSArray* featuresR = [detector featuresInImage:img];
        NSString* decodeR;
        for (CIQRCodeFeature* featureR in featuresR) 
        {
            NSLog(@"decode %@ ",featureR.messageString);
            decodeR = featureR.messageString;

            [self showAlertWithTitle:@"Success" withMessage:decodeR];
           return;
         }

    [self showAlertWithTitle:@"Error" withMessage:@"Invalid Image"];
     }

}

【问题讨论】:

  • 您已经在 UIImages 上进行了扫描?您将它们转换为 CIImage ([[CIImage alloc]initWithImage:image]),然后将它们传递给 CIDetector。
  • 仅适用于扫描二维码,不适用于条码。对于包含条形码的图像,我在调用 featuresInImage 时得到空数组。

标签: ios objective-c qr-code cidetector


【解决方案1】:

到目前为止,Apple 的 AVFoundation 框架还没有提供一种方法来扫描从图像库中挑选的条形码。

所以我通过使用 AVFoundation 框架在实时相机中扫描二维码和条形码来解决我的问题,而当用户从图库中拍摄照片时,我使用 ZBar 框架来扫描二维码和条形码。

【讨论】:

  • Zbar 框架只有我在使用,但有些条码无法扫描从图库中选择的图像有什么解决方案请告诉我。
【解决方案2】:

截至目前,iOS 11 CIDetector 只有以下类型可以从图像中检测

  • CIDetectorTypeFace
  • CIDetectorTypeRectange
  • CIDetectorTypeQRCode
  • CIDetectorTypeText

因此,根据您的要求,我们不能真正依赖CIDectector 从图像中读取条形码和二维码。但是,我们确实有其他选择,例如 AVFoundation 框架 AVCaptureMetadataOutput 但我们需要实时摄像头视图来检测条形码和 QR 码。

对于未来的读者,您可以查看 Swift Camrea 博客文章以检测来自自定义相机的元数据。


如果您的目标是 iOS11 及更高版本,我们确实有一组新的 Vision API 用于从图像中读取条形码。只需创建一个VNDetectBarcodesRequest 并获取条形码结果。查看来自 Github 的 iOS 11 QR Code Example 项目。请注意,由于 iOS 11 仅处于测试阶段,因此视觉 API 的文档还不够成熟。

【讨论】:

    【解决方案3】:

    使用ZXing 图书馆。

    ZXingObjC 是 Java 条形码图像处理库 ZXing(“斑马线”)的完整 Objective-C 端口。它旨在用于 iOS 设备和 Mac 应用程序。

    【讨论】:

    • 我不想使用任何第三方库进行扫描。
    • @Sargis Gevorgyan 你用 swift 试过 ZXing 吗?不是扫描所有二维码。
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多