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

ソースはSwift2なので注意!

以前に書いたQRコードの読み取りサンプルの別バージョン。 今回はカメラ不要で画像データから直接QRコードを読み取りが可能

過去の記事(QRコードの読み取りサンプル

サンプルでは、カメラロールから画像を取得し、認識できたQRコードを切り出して表示している

今回の認識部分は、CoreImageCIDetectorを利用している。 CIDetectorは顔認識や文字認識もできる優れもの

相違点

前回のAVMetadataMachineReadableCodeObjectを利用した方法との違いは、

といった辺り。複数認識可能なのは変わらない

画像データはUIImageが生成できるデータを用意すれば良いので、 元データはローカルファイルでもネット上でも、当然カメラからでもOK

QR検出

検出のコードはとてもシンプル

画像データをCoreImageの形式へ変換し、検出器にかけるだけ

エラー処理を省略して抜粋すると以下の感じ

let ciimg = CIImage(image: image)!
let detector = CIDetector(ofType: CIDetectorTypeQRCode,
                          context: nil, options: nil)
let results = detector.featuresInImage(ciimg) as! [CIQRCodeFeature]

これで、検出されたコードの配列が取得される

CIQRCodeFeatureには

が入っている

検出位置

位置の座標は、画面ではなく画像の座標を基準とした座標で取得される

boundsとそれ以外のbottom〜top〜で取れる座標は、 検出したQRコードが回転していた場合に異なってくる

例えば、斜めの状態のQRコードが検出された場合、 boundsは周りの余白部分を含めた正方形の領域が入る。 それ以外のものにはQRコードの各頂点の座標がそれぞれ入る
(この辺りは実際に斜めの画像を読み込んで見ればよくわかる)

感想

このQRコードの検出はiOS8から可能になっているが、全然把握できていなかったので反省

このCIDetectorは他にもいろいろ検出できるので楽しみ。 他にもまだこういう知らないものがいっぱいあるんだろうな・・・

なお、AVMetadataMachineReadableCodeObjectとの性能などの差は未調査。。。

開発環境

ソース

こちら