1

我已经设置了AVCaptureSession一个视频数据输出,并尝试使用 iOS 11 的 Vision 框架来读取 QR 码。相机的设置基本上与任何设置一样AVCaptureSession。我将缩写并仅显示设置输出。

let output = AVCaptureVideoDataOutput()
output.setSampleBufferDelegate(self, queue: captureQueue)
captureSession.addOutput(output)

// I did this to get the CVPixelBuffer to be oriented in portrait.
// I don't know if it's needed and I'm not sure it matters anyway.
output.connection(with: .video)!.videoOrientation = .portrait

所以相机像往常一样启动并运行。这是我用来执行VNImageRequestHandler二维码的代码。

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .up, options: [:])

    let qrRequest = VNDetectBarcodesRequest { request, error in
        let barcodeObservations = request.results as? [VNBarcodeObservation]
        guard let qrCode = barcodeObservations?.flatMap({ $0.barcodeDescriptor as? CIQRCodeDescriptor }).first else { return }
        if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1) {
            debugPrint(code)
        }
    }

    qrRequest.symbologies = [.QR]
    try! imageRequestHandler.perform([qrRequest])
}

我正在使用编码http://www.google.com为测试的 QR 码。该debugPrint行打印出:

AVGG\u{03}¢ò÷wwrævöövÆRæ6öÐì\u{11}ì

我已经使用AVCaptureMetadataOutput已经存在一段时间的相同的 QR 码进行了测试,并且该方法可以正确解码 QR 码。所以我的问题是,为了得到我得到的输出,我错过了什么?

(显然我可以将其AVCaptureMetadataOutput用作解决方案,因为我可以看到它有效。但这并不能帮助我学习如何使用 Vision 框架。)

4

3 回答 3

0

这似乎可以正常工作,VNBarcodeObservation.payloadStringValue而不是转换VNBarcodeObservation.barcodeDescriptor.

于 2019-09-06T18:01:55.023 回答
0

最有可能的问题在这里:

if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1) 

尝试使用 .utf8。

我还建议在不编码的情况下查看“errorCorrectedPayload”的原始输出。也许它已经有正确的编码。

于 2017-07-28T18:49:42.697 回答
0

errorCorrectedPayload 的定义是: -- QR 码在 ISO/IEC 18004:2006(E) 中正式规定。第 6.4.10 节“比特流到码字的转换”在将消息拆分成块和应用纠错之前立即指定符号中的一组 8 位码字。--

于 2017-07-30T17:33:32.017 回答