2008年10月10日金曜日

QRコードのデコーダライブラリ libdecodeqr-0.9.3 をMacOSXでコンパイルする

QRコードって何バイト情報をもてるのか?という疑問からはじまってちょっと調べてたんだけどふとQRコードのデコーダってフリーであるのか?という疑問で調べた.JavaもあったがC/C++のものがこちら

libdecodeqr


でみてみるとOpenCVが必要ってかいてある.おっ,この前入れたよ.
MacOSXでやった方のページも発見.でも途中で
プログラマの道具箱: osxでlibdecodeqr-0.9.3をコンパイル
とにかくさきにすすみたいので直接
libdecodeqr-0.9.3/src/libdecodeqr /Makefile
を書き換えて、makeだけできるようにする。

うー.その中身もおしえてー.と思ったのだが,まぁできる保証があるというのはありがたい.
で,やってみてその記録を書いておく.

1.ソースコードの取得
0.9.3を同ページからdownload.で展開.
libdecodeqr-0.9.3/srcがソースコードのホーム(?).

2.configureを実行する
portsでopencvを入れたので/opt/local/の下にOpenCV関連は入っている.
で,それに合わせる必要あある.先ほどのサイトのアドバイスもいただき,とりあえずこんな感じでconfigureが成功した.
> LDFLAGS="$LDFLAGS -L/opt/local/lib";export LDFLAGS
> CPPFLAGS="$CPPFLAGS -I/opt/local/include/opencv";export CPPFLAGS
> ./configure --prefix=/opt/local --with-cv=cxcore


3.そのままmakeしてみる.
> make
...
o galois.o imagereader.o libdecodeqr.o
ld -o libdecodeqr.so.0.9.3 bitstream.o codedata.o container.o ecidecoder.o formatinfo.o galois.o imagereader.o libdecodeqr.o -L/opt/local/lib -shared -soname libdecodeqr.so.0 -lcxcore
ld: unknown option: -shared
make[1]: *** [libdecodeqr.so.0.9.3] Error 1
make: *** [libdecodeqr] Error 2
>
これが噂のでもmakeで、失敗…..
MacOS Xのldに-sharedはないらしいんです .
原因はlibraryがdylib形式(?)だから?,
こちらに対策が書かれている

4.そこでlibdecodeqrへ移動.
> cd libdecodeqr

つまるところldでなくg++, -sharedでなく-dynamiclibで頑張るしかないらしい.
あとはopencv用のlib環境を指定すればよいのだろうということでこんな感じ.
>g++ -o libdecodeqr.0.9.3.dylib -dynamiclib -L/opt/local/lib -lcxcore -lcv bitstream.o codedata.o container.o ecidecoder.o formatinfo.o galois.o imagereader.o libdecodeqr.o
>

ということでlibdecodeqr.0.9.3.dylibができた!.あとこのこが使うheaderはMakefileを見ると
decodeqr.h qrerror.h qrtypes.h

らしいので後でインストールする時には気をつける事.

5.いざサンプル作成
いざサンプルなのだが当然Makefileを使うとまたいろいろ面倒.そこで
libdecodeqr-0.9.3/src/sample/webcam
へ移動し,先ほどのサイトのコマンドをそのまま利用させていただく,
> g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` -ldecodeqr -I../../libdecodeqr -L../../libdecodeqr webcam.cpp
#opencv周りを一撃で,'pkg-config --cflags --libs opencv'でも良い.

でできたa.outを実行する(MBPなので内蔵カメラが使用されました).

6.サンプルで遊ぶ
同封されているイメージをARToolkitの時と同様にAirSharingでiPhoneへ移して表示させたものを内蔵カメラで撮影してみる.
でスペースキーで認識.うまく認識されるとこんな感じ(画像は添付されていた01-1.jpg(若干拡大)).

取得された文字列はターミナルに出る.(これがなんて出たかはご自身でどうぞ.).ちなみにサンプルに含まれていた別画像のデコードされた日本語はSJISで出てきてた.


ということで以上でした.
間違いあればご指摘いただけると幸いです.

0 件のコメント: