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

Anu*_*man 0 qr-code barcode ios zbar swift

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

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
    }
Run Code Online (Sandbox Code Playgroud)

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

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

虽然这是二维码类型文档说它也可以检测条形码。美好的。但是当我使用相同的函数来解码条形码时,它会返回一个空的 features 数组。即使它返回给我一些功能,我如何才能将其转换为CIQRCodeFeature? 我在CIQRCodeFeature. 我知道使用 ZBar SDK 你可以做到这一点,但我试图不在这里使用任何第三方库,或者在这方面是否必须使用它?.

请帮忙,非常感谢。

Pri*_*eja 5

您可以使用视觉框架

条码检测请求码

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
    }
Run Code Online (Sandbox Code Playgroud)

您需要在其中传递图像的函数。

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)")
            }
        } 
    }
Run Code Online (Sandbox Code Playgroud)

参考链接