きっかけ
世の中には既にQRコードを読み込めるソフトウェアがたくさんありますが、個人的にOpenCVで顔認識等をしながら、QRコードがあったらそれを読み込むものを作る機会があったので、やってみました。動作環境はMacOS 10.9.5, 言語はC++を使っています。
試行錯誤
顔の検出器を用いて顔認識を行っていたので、QRコードの検出器があればQRコードを切り抜けると考え、こちらの手法を試してみました。
http://cani.hatenablog.com/entry/20090725/1248498850
しかし思った以上に検出誤差が大きく、複数の位置をQRコードとして認識してしまいました。また低解像度のWEBカメラだと厳しいようでした。
そこで用いたのが、ZBarというライブラリです。
http://zbar.sourceforge.net/index.html
GNU LGPL 2.1ライセンスで、商用利用も可能です。
こちらを用いてQRコードの検出、データの抽出まで行いました。
zbarの準備
OpenCVはインストールしている前提で進めます。
まずはZBarのインストールです。macへのインストールは、HomeBrewを用いると楽です。
brew install zbar
でできます。こちらを参考にしました
http://qiita.com/labocho/items/11985fa376b867b8e9ff
これが成功すると、画像でのQR読み込みコマンドが使えるようになります
zbarimg test.jpg
とすると、指定した画像からQRコードを探し、あればその情報を読み取ってくれます。
ZBarにはzbarcamという、webカメラからの画像データからリアルタイムでQRコード読み込みを行うコマンドがあります。しかし上記URLを参考にzbarをインストールすると、このコマンドは使うことができません。インストール時に--disable-videoを指定しているとこのコマンドは使えないようです。ImageMagickをうまくインストールし、解決しようとしましたが、うまくいきませんでした。
しかしながら今回はOpenCVで画像の抽出までは行うので、ここまでの準備は不要です。
コード
コードはこちらのものを使わせて頂きました
https://github.com/ayoungprogrammer/WebcamCodeScanner
こちらをクローンしてきて、ビルドを行います。ビルドするときのコマンドはこんな感じでした。
g++ main.cpp -o main `pkg-config -flags opencv` `pkg-config --libs opencv` `pkg-config --cflags zbar``pkg-config --libs zbar
`
コンパイルしてできた実行ファイルを実行すると、うまくいきました。