QRコードの読み取りサンプル(Swift) その1

ソースはSwift2なので注意!

iOS端末のカメラでQRコードを読み取り、認識されたコードを枠線で強調表示するサンプル

なお、QRコードに限らず、他のバーコードや顔認識にも対応対応形式は公式を参照。地味にiOS8から対応形式が増えている

あと、2次元なら同時認識できたりするが、その辺りの詳細は参考リンクの公式FAQが詳しい

コード認識自体はもっと詳しい説明がいろんなとこにあるので、ここは他で説明していなそうなところだけ

小ネタ

シリアルキューの利用

カメラの起動や画像認識は処理が重いので、それぞれ専用のシリアルキューを作成して利用している

カメラの設定周りはフリーズ状態になるのを防ぐためだが、最近の端末は起動が早いらしく、キューを使わなくても特に問題無い感じ

AVMetadataMachineReadableCodeObject

認識されたコードはAVMetadataMachineReadableCodeObjectのオブジェクトの配列で渡される

プレビュー画面上に認識したコードの枠を表示する

AVMetadataMachineReadableCodeObjectの中のcornersにコードの座標位置が含まれているが、これはプレビューのViewの座標系とは異なるので、そのままでは使えない

AVCaptureVideoPreviewLayertransformedMetadataObjectForMetadataObjectで変換後の座標が入ったAVMetadataObjectが取得できるので、その中のboundsを使って枠線を描画している

(以前は手動でちゃんとプレビュー画面上の座標に変換していたが、今回、この簡単に変換できるメソッドを発見!AVCaptureVideoPreviewLayerの方もちゃんと調べていれば・・・)

感想

昔iOS7で使えるようになった時に試したものを、Swiftで書き直し+αしたコード。やはりSwiftはわかりやすく、かつエラー処理もしっかり書いても、Objective-Cよりコードが少ないので良い

以前は結構カメラの起動もコードの読み取りも時間がかかっていたのだが、今回はかなりスピードアップした感じがした。iPhoneのカメラの進化もすごいということか。ただ、バッテリーには優しくないので常に使うのは厳しそう・・・

あと、カメラをわざわざ起動しなくても画像を直接認識してくれるようになって欲しい。 (6/17追記:方法が判ったのでその2を作成した)

参考リンク

開発環境

ソース

こちら

カメラ不要なバージョンはこちら