ASCII倶楽部

このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング 第89回

Visionフレームワークを利用(その2)

バーコードやQRコードを認識・デコードするプログラム

2018年05月30日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 前回と前々回は、機械学習の成果を手軽に享受できるようにするCore MLを間接的に利用するVisionフレームワークを使ってみました。それによって、写真に含まれる人の顔や、文字を認識するプログラムを作りました。そのVisionには、いろいろな種類の認識機能があります。人間にとって意味を持つ認識対象としては、顔と文字以外にも、バーコードを認識する機能が含まれています。今回は、そのバーコードの認識機能を使ってみることにします。

 ここで言う「バーコード」には、「2次元バーコード」とも呼ばれるQRコードも含まれています。Visionを利用すると、まったく同じプログラムで従来のバーコードもQRコードも認識できるのです。しかも、1つの画像の中にバーコードとQRコードが混在していても、何の苦もなく認識し分けることができます。

 Visionによるバーコードの認識機能には、前回の文字認識とは明らかに異なる部分があります。文字認識では、単語(欧文の場合)と、その中に含まれる個々の文字の、画像としての枠を認識するだけで、それらが表す語や文字を文字列として抽出するようなことはできませんでした。バーコードの場合には、画像としてのコードの枠を認識するのはもちろん、1歩進んでコードを「読む」ことができます。つまり、コードが表す数字や文字列をString型の値として取り出すことができるのです。

 今回は、まず前回までのプログラムに最小限の変更を加えて、バーコードを認識するプログラムを動かします。それができたら、画面に表示した画像の中で、認識させたいコードの部分をタップすると、その内容を読み取り、アラートに文字列として表示するアプリ風のプログラムに仕上げてみましょう。

Visionを使ってバーコードを識別する

 Visionを利用したこれまでのプログラムでは、認識した顔や文字の領域を画像の上に重ねて長方形を描くことで示してきました。今回も、まずは同じ形のプログラムによって認識したバーコードの領域を表示してみましょう。同じフレームワークを同じように使うだけあって、プログラムは前回までに示したものと共通する部分が多くなっています。

 大きく異なるのは、当然ながら認識する対象を示すリクエストのクラスがVNDetectBarCodesRequestとなっていることです。

Visionフレームワークを使ってバーコードやQRコードを認識させるには、まずリクセストのタイプをVNDetectBarcodeRequestに変更します。これで元来のバーコードもQRコードもカバーします

 このクラスによって、QRコードも一般的なバーコードも認識できます。また、本質的なことではありませんが、認識する画像とその上に枠を描く画像は同じなので、ファイル名を1箇所で設定できるようにしています。今回は、「QRCode」でGoogle検索した結果を、画像として表示させた画面のスクリーンショットを切り取って使いました。

 あとはリクエストのタイプに合わせて、結果のタイプもVNBarcodeObservationに変更しています。

バーコードやQRコードの認識では、コードの画像としての枠だけでなくコードの内容を文字列として認識することができます。その値は認識結果のpayloadStringValueというプロパティで得ることができます

 この認識結果は、1つの画像に含まれる複数の領域を検出することが前提なので、forループを回して結果の領域を画像の上に描いています。すでに述べたようにバーコードの場合には、内容を表す文字列まで識別できるので、それを確認できるように、payloadStringValueのプロパティを書いておきました。この値は後で、デバッグ機能を使って確認しましょう。

 前回までと同じようにプログラムを動作させた結果の画像を確認すると、認識したQRコードの周囲に緑色の枠が描かれています。

複数のQRコードが並んだ画像を認識させると、すべてのQRコードに緑色の枠が重ねて描画されることがプレイグラウウンドのデバッグ機能で確認できます

 また、認識結果を描画するforループの先頭にあるfObs.payloadStringValueの行の右端をタップすると、最後に認識したQRコードの内容を文字列として確認できます。

認識結果のpayloadStringValueプロパティをデバッグ機能で表示してみると、最後に認識したQRコードが何らかのURLを表していることがわかります。「ビューアを追加」してリスト表示すれば、すべてのコードの内容を知ることもできます

 画像をQRコードから一般的なバーコードの変更すれば、同じプログラムで同様に認識できます。

QRコードの画像をバーコードに入れ替えても、まったく同じプログラムによって認識させることができます。通常のバーコードは1次元のコードなので横一直線の枠で認識されています

 面白いのは、バーコードの場合には1つのコードの複数の場所を認識していることです。これは効率的とは言えませんが、スーパーやコンビニのレジの光学的なバーコードスキャナの動きを見るようで、興味深いものがあります。

カテゴリートップへ

この連載の記事

ASCII倶楽部の新着記事

会員専用動画の紹介も!