こんにちわ。開発エンジニアのsugimotoです。
今回は先日ちょっと触る機会のあったQRコードについて、手近なモバイル端末で検証してみて、それについて書いてみたいと思います。
QRコードの説明は
- http://www.tech-jp.com/QRCode/
- http://www.keyence.co.jp/barcode/2jigenbasic/chishiki4.html
- http://www.docomo.biz/html/service/qr/faq/01.html
とりあえずこの先読む上で必要な要点をまとめると
- 誤り訂正が可能。レベルはH、Q、M、L
- バージョンは1から40まであり、バージョンが大きくなると格納できるデータ量も大きくなる
- 各パターンの図(出典:http://www.docomo.biz/html/service/qr/faq/01.html)
- 位置検出パターン:方向や位置の認識
- アライメントパターン:歪みの補正
- タイミングパターン:バージョンの検知
それでは実機を使っての検証開始です。
検証項目は次の通りです。- 機種別の読み取り精度
- 誤り訂正レベル
- 位置検出パターン
- アライメントパターン
- タイミングパターン
QRコードはPerlのGD::Barcode::QRcodeを用いて生成しています。
・機種別の読み取り精度
機種別で読み取りにどの程度があるのかを検証をしてみました。
検証に使用した機種は次の通りです。
- Google Nexus7
- Apple iPad(第3世代)
- Samsung Galaxy S2 LTE
- Apple iPhone4S
まずは誤り訂正レベルHです。
結果は次の通り。手振れとかの影響で多少誤差はあるかもしれません。
次に誤り訂正レベルLです。
誤り訂正レベルの違いによっても多少違いが出ています。
真正面から撮っているので全ての情報が読み取れているなら誤り訂正レベルによって差異は生じないと思います。
しかし、実際差がでているので、正面から撮ったとしても誤り訂正して補っているのかもしれません(短時間に読み取るために白黒判断ができない場所は切り捨ててるのかも)。
また、機種による違いですが、使用しているアプリの違いもあるかもしれませんが、それよりもカメラの画素数(というかカメラの性能かも)によるところが大きいのかもしれません。
各機種のカメラの画素数は
- Google Nexus7:120万画素
- Apple iPad(第3世代):500万画素
- Apple iPhone4S:800万画素
- Samsung Galaxy S2 LTE:810万画素
です。
読み取り結果と画素数を見比べると、画素数(もしくは画素数以外のカメラの性能の違い)が大きいほどよりバージョンの大きいものが読み取れています。
iPadとiPhone、Nexus7とGalaxyはそれぞれ同じアプリを使用しているので、アプリの差はあまりないのかもしれません。
・誤り訂正レベル
誤り訂正についての検証です。
使用した機種はGalaxy S2 LTEです。誤り訂正レベルはH、Lです。
こんな感じに画面に付箋張って読み取れる範囲を制限しました。
正確に何%隠すのは正直難しかったので、一定間隔にあるアライメントパターンを参考にざっくり出してます。
結果は
- H:約25%
- L:約3%
でした。
また毎回読み取れるわけではなく、Hで10%程度隠した場合でも読み取れないことがありました。
まわりの環境(光とか)、撮り方が影響を与えているのかもしれません。
いずれにしろ、HでMAXの30%欠損したものは読めませんでした。・位置検出パターン
位置検出パターンを隠した時の読み取り検証です。
使用した機種は誤り訂正レベルと同様にGalaxy、誤り訂正レベルはHです。
こんな感じで3つの位置検出パターンのうち、右上のものを隠してみました。
結果は全く読み取れませんでした。
どうやら一つでも位置検出パターンを検出できないと向きが分からず、読み取りができないようです。
では、どの程度なら隠しても大丈夫なのでしょうか?
位置検出パターンを部分的に隠して試してみました。
試したのは次の4パターンです。
- 真ん中の黒い部分は隠さず、右の白い箇所と黒い箇所を隠す
- 真ん中の黒い部分と白い部分は隠さず、右の黒い部分を隠す
- 真ん中の黒い部分と白い部分、右の黒い部分の下半分は隠さず、右の黒い部分の上半分を隠す
- 真ん中の黒い部分と白い部分、右の黒い部分の下3分の2は隠さず、右の黒い部分の上3分の1を隠す
http://www.keyence.co.jp/barcode/2jigenbasic/chishiki4.htmlによると、白黒の比率でパターンを認識しているということなので、読み取れない場合はパターン認識で必要な箇所を隠していたということでしょう。
アライメントパターンを隠した時の読み取り検証です。
アライメントパターンは歪み補正に使用されるということなので、45°程度斜めから読み取ってみました(斜めから撮れば歪むだろうという考え)。
使用した機種は誤り訂正レベルと同様にGalaxy、誤り訂正レベルはHです。
こんな感じに右下のアライメントパターンを隠しました。
隠したところの分だけ欠損してますが、誤り訂正レベルはHなので問題ありません。
結果は、時間かけても読み取れませんでした。
そもそも斜めからだと読み取れないのかと思い、アライメントパターンを隠さずに試したら読み取ることが出来ました。
また、アライメントパターンを隠して正面から試しても読み取ることはできました。
アライメントパターンも位置検出パターンと同様、誤り訂正できるからといって隠さない方が無難な代物のようです。
・タイミングパターン
タイミングパターンを隠した時の読み取り検証です。
他の検証と同様に機種はGalaxy、誤り訂正レベルはHです。
こんな感じで隠してます。
結果は、隠しても読み取れました。
タイミングパターンはQRコードのバージョンを検出するためのもののようなのでバージョンがわからなくても何とかなってしまうのかもしれません。
以上で検証は終わりです。
今回は手近にあるものを使用して検証しましたが、専用端末を使えばもっと読み取り精度は上がるのかもしれません。
とりあえず四隅のしるしを隠さなければ、訂正できる範囲内で隠したり汚れても読み取れることがわかりました。
今回の内容がモバイル端末でのQRコード読み取りで何かの助けになれば幸いです。