Ios 带有VNDettectBarCodeRequest的QR读卡器
我已经设置了一个带有视频数据输出的Ios 带有VNDettectBarCodeRequest的QR读卡器,ios,avfoundation,qr-code,apple-vision,Ios,Avfoundation,Qr Code,Apple Vision,我已经设置了一个带有视频数据输出的AVCaptureSession,并尝试使用iOS 11的Vision框架读取二维码。摄像头的设置与任何AVCaptureSession基本相同。我将简略介绍如何设置输出 let output = AVCaptureVideoDataOutput() output.setSampleBufferDelegate(self, queue: captureQueue) captureSession.addOutput(output) // I did this t
AVCaptureSession
,并尝试使用iOS 11的Vision框架读取二维码。摄像头的设置与任何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
因此,摄像机像往常一样启动并运行。下面是我用来为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])
}
我使用的二维码编码http://www.google.com
作为测试。debugPrint
行打印出:
AVGG\u{03}÷wwrævövÆRæ6ö208;ì\u{11}ì
我用已经存在一段时间的avcapturemataoutput
测试了相同的QR码,该方法正确地解码了QR码。所以我的问题是,我错过了什么来获得我正在获得的输出
(显然,我可以使用
avcaptureMataOutput
作为解决方案,因为我可以看出它是有效的。但这无助于我学习如何使用Vision框架。)最有可能的问题是:
if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1)
尝试使用.utf8
此外,我建议查看未经编码的“errorCorrectedPayload”的原始输出。也许它已经有了正确的编码 最可能的问题是:
if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1)
尝试使用.utf8
此外,我建议查看未经编码的“errorCorrectedPayload”的原始输出。也许它已经有了正确的编码 errorCorrectedPayload的定义是:
--QR码在ISO/IEC 18004:2006(E)中有正式规定。第6.4.10节“比特流到码字转换”规定了在将消息拆分为块并应用纠错之前符号中的一组8位码字-- errorCorrectedPayload的定义是:
--QR码在ISO/IEC 18004:2006(E)中有正式规定。第6.4.10节“比特流到码字转换”规定了在将消息拆分为块并应用纠错之前符号中的一组8位码字-- 这似乎适用于
VNBarcodeObservation.payloadStringValue
而不是转换VNBarcodeObservation.barcodescriptor
这似乎适用于VNBarcodeObservation.payloadStringValue
而不是转换VNBarcodeObservation.barcodescriptor
.isoLatin1
,因为这是二维码的标准()。我将研究其他编码,看看是否有帮助。我还要看看是否能理解原始字节。谢谢你的建议。我试过的其他编码都没有更好的。有些返回了nil
,有些返回了相同的加扰文本。经过一些测试,我认为errorCorrectedPayload不是QR数据本身。在CIQRCodeDescriptor的源文件中,它说errorCorrectedPayload是“组成QR码符号的经错误纠正的码字”。这不是很清楚。我选择了.isoLatin1
,因为这是QR码的标准()。我将研究其他编码,看看是否有帮助。我还要看看是否能理解原始字节。谢谢你的建议。我试过的其他编码都没有更好的。有些返回了nil
,有些返回了相同的加扰文本。经过一些测试,我认为errorCorrectedPayload不是QR数据本身。在CIQRCodeDescriptor的源文件中,它说errorCorrectedPayload是“组成QR码符号的经纠错的码字”,这不是很清楚。