我已經設置了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碼符號的糾錯碼字。」這不是很清楚。 –