如何在Swift中从图像中检测条形码?

3

我正在尝试从用户选择的图像中检测条形码。我能够从图像中检测到QR码,但是找不到任何与从图像扫描条形码相关的内容。我用来从图像中检测QR码的代码如下:

func detectQRCode(_ image: UIImage?) -> [CIFeature]? {
        if let image = image, let ciImage = CIImage.init(image: image){
            var options: [String: Any]
            let context = CIContext()
            options = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
            let qrDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: options)
            if ciImage.properties.keys.contains((kCGImagePropertyOrientation as String)){
                options = [CIDetectorImageOrientation: ciImage.properties[(kCGImagePropertyOrientation as String)] ?? 1]
            }else {
                options = [CIDetectorImageOrientation: 1]
            }
            let features = qrDetector?.features(in: ciImage, options: options)
            return features

        }
        return nil
    }

当我进入 CIDetectorTypeQRCode 的文档时,它说:

/* Specifies a detector type for barcode detection. */
@available(iOS 8.0, *)
public let CIDetectorTypeQRCode: String

虽然这是QR码类型的文档,但它也可以检测条形码。但是,当我使用相同的函数解码条形码时,它会返回一个空数组的功能。即使它返回一些功能,我如何转换为CIQRCodeFeature的条形码替代品呢?我在CIQRCodeFeature的文档中没有看到任何条形码替代品。我知道使用ZBar SDK可以做到这一点,但我试图避免在这里使用任何第三方库,或者在这方面必须使用它吗?
请帮助,非常感谢。

似乎 CIDetectorTypeQRCode 只能检测 QR 码。唯一支持的类型可以在文档 https://developer.apple.com/documentation/coreimage/cidetector 中找到。如果您不想依赖第三方库,您将需要自己编写一个 CIDetector,但我无法确定这种尝试会有多复杂。 - jms
那么我想第三方库是唯一的解决方案了。好吧,那我就使用 Firebase 的 MLKit 吧。谢谢。 - Anuran Barman
stackoverflow.com上搜索VNDetectBarcodesRequest - rmaddy
尝试这个 https://stackoverflow.com/a/57285925/5084797 - manishsharma93
@manishsharma93 这适用于来自相机的实时视频,而不适用于静态图像。 - rmaddy
我不能确定@AnuranBarman的正确性,但你可以看到基本的CIRectangleFeature被支持。你需要自己编写一个包装器来检测条形码。这似乎是一个非常有趣的练习^^ - jms
1个回答

8

您可以使用Vision Framework

条形码检测请求代码

var vnBarCodeDetectionRequest : VNDetectBarcodesRequest{
        let request = VNDetectBarcodesRequest { (request,error) in
            if let error = error as NSError? {
                print("Error in detecting - \(error)")
                return
            }
            else {
                guard let observations = request.results as? [VNDetectedObjectObservation]
                    else {
                        return
                }
                print("Observations are \(observations)")
            }
        }
        return request
    }

需要传递图片的函数。

func createVisionRequest(image: UIImage)
    {
        guard let cgImage = image.cgImage else {
            return
        }
        let requestHandler = VNImageRequestHandler(cgImage: cgImage, orientation: image.cgImageOrientation, options: [:])
        let vnRequests = [vnBarCodeDetectionRequest]
        DispatchQueue.global(qos: .background).async {
            do{
                try requestHandler.perform(vnRequests)
            }catch let error as NSError {
                print("Error in performing Image request: \(error)")
            }
        } 
    }

Reference Link


1
有趣。谢谢提供链接,增加了额外的知识。我已经通过Firebase MLKit完成了这项工作。不过还是感谢你的回答。 - Anuran Barman
视觉框架,我喜欢它。 - Yoon Lee

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