使用CIDetector扫描条形码(一维和二维码)

4
我想从实时摄像头和图像中扫描qr码和条形码。我之前使用的是ZBar库进行扫描,但它不能扫描特定类型的qr码和条形码。同时,苹果的AVFoundation框架在从实时摄像头扫描代码时似乎更快更准确。
因此,我不想使用ZBar。为了从图库中选择的图像扫描代码,我正在使用CIDetector。但是,CIDetector似乎无法从图像中扫描条形码。我已经在Stack Overflow上搜索过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。 - Lepidopteron
这只适用于扫描QR码,而不适用于条形码。当调用featuresInImage时,对于包含条形码的图像,我得到了一个空数组。 - Jaffer Sheriff
3个回答

1
到目前为止,苹果的AVFoundation框架还没有提供一种从图像库扫描条形码的方法。因此,我通过使用AVFoundation框架在实时摄像头中扫描QR码和条形码来解决了我的问题,而当用户从相册选择照片时,我使用ZBar框架扫描QR码和条形码。

我只使用了Zbar框架,但有些从相册中选择的条形码无法扫描。请问是否有解决方案?请告知。 - vijay

1
截至目前,iOS 11的CIDetector仅能从图像中检测以下类型:
  • CIDetectorTypeFace
  • CIDetectorTypeRectange
  • CIDetectorTypeQRCode
  • CIDetectorTypeText
因此,根据您的要求,我们不能依靠CIDectector来读取图像中的条形码和二维码。但是,我们有其他选择,比如AVFoundation框架的AVCaptureMetadataOutput,但我们需要一个实时相机视图来检测条形码和二维码。
对于未来的读者,您可以查看Swift Camrea博客文章,以检测自定义相机中的元数据。
如果您的目标是iOS11及以上版本,我们有一组新的VisionAPI来从图像中读取条形码。只需创建一个VNDetectBarcodesRequest并获取条形码结果即可。请查看来自Github的iOS 11 QR Code Example项目。请注意,由于iOS 11仅处于beta阶段,因此视觉API的文档尚不够成熟。

0

使用 ZXing 库。

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


我不想使用任何第三方库来进行扫描。 - Jaffer Sheriff
@Sargis Gevorgyan,你尝试过在Swift中使用ZXing吗?它不能扫描所有的QR码。 - Mac_Play

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接