使用iOS11 Vision Framework时的条码字符串值

yos*_*ile 6 barcode swift ios11 apple-vision

以下 Swift 代码使用新的 iOS11 Vision 框架来分析图像并查找其中的二维码。

let barcodeRequest = VNDetectBarcodesRequest(completionHandler {(request, error) in
    for result in request.results! {
        if let barcode = result as? VNBarcodeObservation {                    
            if let desc = barcode.barcodeDescriptor as? CIQRCodeDescriptor {
                let content = String(data: desc.errorCorrectedPayload, encoding: .isoLatin1)
                print(content) //Prints garbage
            }
        }
    }
}
let image = //some image with QR code...
let handler = VNImageRequestHandler(cgImage: image, options: [.properties : ""])
try handler.perform([barcodeRequest])
Run Code Online (Sandbox Code Playgroud)

然而,问题是返回的是从二维码读取的desc.errorCorrectedPayload原始编码数据。
为了从描述符中获取可打印的内容字符串,必须解码该原始数据(例如,根据前 4 位确定模式)。

它变得更加有趣,因为苹果已经在 AVFoundation 中拥有用于解码原始数据的代码。该类AVMetadataMachineReadableCodeObject已经具有.stringValue返回解码字符串的字段。

是否可以访问此解码代码并在 Vision 框架中使用它?

swa*_*sta 6

看来现在您可以使用 iOS 11 beta 5 中引入的新的PayloadStringValue属性从条形码中获取解码后的字符串VNBarcodeObservation

if let payload = barcodeObservation.payloadStringValue {
    print("payload is \(payload)")
}
Run Code Online (Sandbox Code Playgroud)