AVCaptureSession
にビデオデータ出力を設定し、iOS 11のVisionフレームワークを使用してQRコードを読み取ろうとしました。カメラは基本的にはAVCaptureSession
のように設定されています。私は省略して出力を設定するだけです。QR Reader with 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])
}
私はテストとしてhttp://www.google.com
エンコードQRコードを使用しています。 debugPrint
ラインアウト出力します
AVGG\u{03}¢ò÷wwrævöövÆRæ6öÐì\u{11}ì
は、私はしばらくの間、回避されているAVCaptureMetadataOutput
でこれと同じQRコードをテストしているし、その方法は、正しくQRコードをデコードします。だから私の質問は、私が得ている出力を得るために逃したものは何ですか?
(もちろん、私はそれが動作することを確認できるので、私はちょうど、ソリューションとしてAVCaptureMetadataOutput
を使用することができます。しかし、それは私がビジョンのフレームワークを使用する方法を学ぶ助けにはならない。)
これはQRコードの標準であるため、私は '.isoLatin1'と一緒に行きました([reference](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コードシンボルを構成するエラー修正されたコードワード」となっています。それはあまり明確ではない。 –