我已经设置了AVCaptureSession
一个视频数据输出,并尝试使用 iOS 11 的 Vision 框架来读取 QR 码。相机的设置基本上与任何设置一样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
所以相机像往常一样启动并运行。这是我用来执行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
为测试的 QR 码。该debugPrint
行打印出:
AVGG\u{03}¢ò÷wwrævöövÆRæ6öÐì\u{11}ì
我已经使用AVCaptureMetadataOutput
已经存在一段时间的相同的 QR 码进行了测试,并且该方法可以正确解码 QR 码。所以我的问题是,为了得到我得到的输出,我错过了什么?
(显然我可以将其AVCaptureMetadataOutput
用作解决方案,因为我可以看到它有效。但这并不能帮助我学习如何使用 Vision 框架。)