Ios 带有VNDettectBarCodeRequest的QR读卡器

Ios 带有VNDettectBarCodeRequest的QR读卡器,ios,avfoundation,qr-code,apple-vision,Ios,Avfoundation,Qr Code,Apple Vision,我已经设置了一个带有视频数据输出的AVCaptureSession,并尝试使用iOS 11的Vision框架读取二维码。摄像头的设置与任何AVCaptureSession基本相同。我将简略介绍如何设置输出 let output = AVCaptureVideoDataOutput() output.setSampleBufferDelegate(self, queue: captureQueue) captureSession.addOutput(output) // I did this t

我已经设置了一个带有视频数据输出的
AVCaptureSession
,并尝试使用iOS 11的Vision框架读取二维码。摄像头的设置与任何
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
因此,摄像机像往常一样启动并运行。下面是我用来为QR码执行
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
作为测试。
debugPrint
行打印出:

AVGG\u{03}÷wwrævövÆRæ6ö208;ì\u{11}ì

我用已经存在一段时间的
avcapturemataoutput
测试了相同的QR码,该方法正确地解码了QR码。所以我的问题是,我错过了什么来获得我正在获得的输出


(显然,我可以使用
avcaptureMataOutput
作为解决方案,因为我可以看出它是有效的。但这无助于我学习如何使用Vision框架。)

最有可能的问题是:

if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1) 
尝试使用.utf8


此外,我建议查看未经编码的“errorCorrectedPayload”的原始输出。也许它已经有了正确的编码

最可能的问题是:

if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1) 
尝试使用.utf8


此外,我建议查看未经编码的“errorCorrectedPayload”的原始输出。也许它已经有了正确的编码

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

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

这似乎适用于
VNBarcodeObservation.payloadStringValue
而不是转换
VNBarcodeObservation.barcodescriptor
这似乎适用于
VNBarcodeObservation.payloadStringValue
而不是转换
VNBarcodeObservation.barcodescriptor
.isoLatin1
,因为这是二维码的标准()。我将研究其他编码,看看是否有帮助。我还要看看是否能理解原始字节。谢谢你的建议。我试过的其他编码都没有更好的。有些返回了
nil
,有些返回了相同的加扰文本。经过一些测试,我认为errorCorrectedPayload不是QR数据本身。在CIQRCodeDescriptor的源文件中,它说errorCorrectedPayload是“组成QR码符号的经错误纠正的码字”。这不是很清楚。我选择了
.isoLatin1
,因为这是QR码的标准()。我将研究其他编码,看看是否有帮助。我还要看看是否能理解原始字节。谢谢你的建议。我试过的其他编码都没有更好的。有些返回了
nil
,有些返回了相同的加扰文本。经过一些测试,我认为errorCorrectedPayload不是QR数据本身。在CIQRCodeDescriptor的源文件中,它说errorCorrectedPayload是“组成QR码符号的经纠错的码字”,这不是很清楚。