2017-07-28 199 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位碼字。 -