2017-07-28 198 views
0

我已经设置了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的解决方案,因为我可以看到,它的作品。但是,这并不能帮助我了解如何使用视觉框架。)

回答

0

最有可能的问题是在这里:

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

尝试使用.utf8。

此外,我会建议看看'errorCorrectedPayload'的原始输出没有编码。也许它已经有了正确的编码。

+0

我用'.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

+0

我试过的其他编码都没有更好。有些返回'nil',有些返回相同的乱码文本。 – keithbhunter

+0

经过一番测试,我认为errorCorrectedPayload不是QR数据本身​​。在CIQRCodeDescriptor的源文件中,它表示errorCorrectedPayload是 - “包含QR码符号的纠错码字。”这不是很清楚。 –

0

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