2017-07-28 7 views
0

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を使用することができます。しかし、それは私がビジョンのフレームワークを使用する方法を学ぶ助けにはならない。)

答えて

0

は、ほとんどの場合、問題はここにあります:

if let code = String(data: qrCode.errorCorrectedPayload, encoding: .isoLatin1) 

.utf8を使用してください。

また、 'errorCorrectedPayload'の生の出力をエンコードせずに調べることをお勧めします。おそらくそれはすでに正しいエンコーディングを持っています。

+0

これは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

+0

私が試した他のエンコーディングは、それほど優れていませんでした。いくつかは 'nil'を返し、いくつかは同じスクランブルテキストを返しました。 – keithbhunter

+0

いくつかのテストの後、私はerrorCorrectedPayloadがQRデータそのものではないと思います。 CIQRCodeDescriptorのソースファイルでは、errorCorrectedPayloadが「QRコードシンボルを構成するエラー修正されたコードワード」となっています。それはあまり明確ではない。 –

0

errorCorrectedPayloadの定義は次のとおりです。 - QRコードは、ISO/IEC 18004:2006(E)で正式に指定されています。 6.4.10項「ビットストリームからコードワードへの変換」では、メッセージをブロックに分割してエラー訂正を適用する直前に、シンボル内の8ビットコードワードのセットを指定します。 -