QRコードの読み取りサンプル(Swift) その2
Jun 16, 2016 · oldswift2
ソースはSwift2なので注意!
以前に書いたQRコードの読み取りサンプルの別バージョン。 今回はカメラ不要で画像データから直接QRコードを読み取りが可能
過去の記事(QRコードの読み取りサンプル)
サンプルでは、カメラロールから画像を取得し、認識できたQRコードを切り出して表示している
今回の認識部分は、CoreImage
のCIDetector
を利用している。
CIDetector
は顔認識や文字認識もできる優れもの
相違点
前回のAVMetadataMachineReadableCodeObject
を利用した方法との違いは、
- 画像データから読み取り可能
- 読み取り可能なコードはQRコードのみ
といった辺り。複数認識可能なのは変わらない
画像データは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
:コードを検出した領域bottomLeft bottomRight topLeft topRight
:コードを検出した位置messageString
:コードに含まれるデータ
が入っている
検出位置
位置の座標は、画面ではなく画像の座標を基準とした座標で取得される
bounds
とそれ以外のbottom〜
やtop〜
で取れる座標は、
検出したQRコードが回転していた場合に異なってくる
例えば、斜めの状態のQRコードが検出された場合、
bounds
は周りの余白部分を含めた正方形の領域が入る。
それ以外のものにはQRコードの各頂点の座標がそれぞれ入る
(この辺りは実際に斜めの画像を読み込んで見ればよくわかる)
感想
このQRコードの検出はiOS8
から可能になっているが、全然把握できていなかったので反省
このCIDetector
は他にもいろいろ検出できるので楽しみ。
他にもまだこういう知らないものがいっぱいあるんだろうな・・・
なお、AVMetadataMachineReadableCodeObject
との性能などの差は未調査。。。
開発環境
- Xcode 7.3.1
- Swift 2.2
- iOS 9.3.2
- iPhone 6+