我已经设置了AVCaptureSession
与视频数据输出,并试图使用iOS 11的Vision框架来读取QR码。相机设置基本上是任何AVCaptureSession
是。我会缩写并显示设置输出。QR阅读器与VNDetectBarcodeRequest
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])
}
我使用的是QR码,它将http://www.google.com
编码为测试。该debugPrint
行打印出来:
AVGG\u{03}¢ò÷wwrævöövÆRæ6öÐì\u{11}ì
我已经测试此相同的QR码与AVCaptureMetadataOutput
一个已经存在了一段时间,该方法QR码正确解码。所以我的问题是,我错过了什么来获得我得到的输出?
(很显然,我可以只使用AVCaptureMetadataOutput
的解决方案,因为我可以看到,它的作品。但是,这并不能帮助我了解如何使用视觉框架。)
我用'.isoLatin1'去,因为这是QR码的标准([参考](https://www.ibm.com/support/knowledgecenter/en/SSBJG3_2.5.0/com.ibm.gen_studug .DOC/c_grd_barcodes_qr_code.htm))。我会研究其他编码,看看是否有帮助。我还会看看我能否理解原始字节。感谢您的建议。 – keithbhunter
我试过的其他编码都没有更好。有些返回'nil',有些返回相同的乱码文本。 – keithbhunter
经过一番测试,我认为errorCorrectedPayload不是QR数据本身。在CIQRCodeDescriptor的源文件中,它表示errorCorrectedPayload是 - “包含QR码符号的纠错码字。”这不是很清楚。 –