【问题标题】:Scanning barcode from UIImage natively (i.e., not using ZBar)本机从 UIImage 扫描条形码(即不使用 ZBar)
【发布时间】:2015-06-02 02:29:47
【问题描述】:

我从 iOS7 开始就一直在使用苹果提供的原生条码扫描器功能,它很棒,但我需要扫描一些我拥有的静态图像,以便自动对一些条码进行分类。

我无法找到本地执行此操作的方法,因此我使用了一个名为 zBar 的开源包,并且在大多数情况下,它工作正常。

但是,它经常返回错误值,有时甚至无法找到条形码。我还从头开始构建了 c++ 库,但在我的 OS X 构建中得到了相同的结果。这似乎也是一个废弃的项目。

即使我从计算机显示器扫描图像,Apple 的本地解决方案也会在此静态图像上找到条形码!返回错误/错误值的图像也是如此。

那么有没有办法使用苹果的库来扫描 UIImage?

【问题讨论】:

  • 你有没有找到任何解决方案,或者现在不可能?
  • 不,很遗憾没有。
  • UIImage 上二维码的 CIDetector。检查文档。 stackoverflow.com/questions/28317071/…
  • zxing objc 端口现在似乎已经相当更新了。从我的少数测试来看,它比 CoreImage 识别得更好。即使 CI 做编码。见github.com/TheLevelUp/ZXingObjC

标签: ios objective-c macos uiimage barcode


【解决方案1】:

现在可用的一个选项是 Firebase 的 MLKit。

在他们的控制台https://firebase.google.com 中设置您的项目后,将 Firebase 添加到您的项目中

我使用 cocoapods 来管理依赖关系,如果你这样做了,那么将它添加到你的 Podfile 和 pod update:

pod 'Firebase/Core'
pod 'Firebase/MLVision'
pod 'Firebase/MLVisionBarcodeModel'

这是一个演示视图控制器实现,您可以在其中从照片库中选择要由 ML 套件扫描的条形码图像,并将结果打印在标签中。

// (Don't forget to ask for Photos access by including this in your info.plist)

    <key>NSPhotoLibraryUsageDescription</key>
    <string>Enable photo library access to select a photo from your library.</string>



import Firebase

class MyDemoViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    lazy var vision = Vision.vision()
    @IBOutlet var textLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func selectImage(_ sender: Any) {
        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){
            print("Button capture")

            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .savedPhotosAlbum;
            imagePicker.allowsEditing = false

            self.present(imagePicker, animated: true, completion: nil)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
            return
        }

        dismiss(animated: true, completion: {
            self.checkForCodeInImage(image: image)
        })
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion:nil)
    }

    internal func checkForCodeInImage(image: UIImage) {
        let detector = vision.barcodeDetector(options: VisionBarcodeDetectorOptions(formats: .all))
        let vImage = VisionImage(image: image)

        detector.detect(in: vImage) { features, error in
            guard error == nil, let barcodes = features, barcodes.isEmpty == false else {
                DispatchQueue.main.async {
                    self.textLabel.text = "No code found in selected image."
                }
                return
            }

            var text = ""

            for barcode in barcodes {

                guard let rawValue = barcode.rawValue else {
                    continue
                }

                let corners = barcode.cornerPoints
                let displayValue = barcode.displayValue

                print("Corners: \(String(describing: corners))")
                print("Found: \(String(describing: displayValue))")

                text.append(rawValue)
                text.append("\n\n")

//                let valueType = barcode.valueType
//                switch valueType {
//                case .wiFi:
//                    let ssid = barcode.wifi!.ssid
//                    let password = barcode.wifi!.password
//                    let encryptionType = barcode.wifi!.type
//                case .URL:
//                    let title = barcode.url!.title
//                    let url = barcode.url!.url
//                default:
//                    // See API reference for all supported value types
//                    break
//                }
            }

            DispatchQueue.main.async {
                self.textLabel.text = text
            }
        }
    }
}

这是他们文档的链接:https://firebase.google.com/docs/ml-kit/ios/read-barcodes

【讨论】:

  • 我会假设这个成功,而其他失败。
【解决方案2】:

试试这个

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

【讨论】:

  • 不幸的是,到目前为止我还没有让这个工作。有时 UIImage 没有 CIImage,您必须手动重新创建它。即使那样,代码也永远不会为我返回条形码。仍在调查中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多