rubyからZBar bar code readerを利用して、画像バーコードからISBNコードを取得するということがやりたかったのですが、
結果うまく行きませんでした。
- Uubuntu14.04
- ruby 2.1.2
- zbar 0.10
zbarのインストール
ubuntuでは、apt-getでインストールできます。
私の環境には既に入っていました。
$ sudo apt-get install libzbar0 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 libzbar0 は既に最新バージョンです。 libzbar0 は手動でインストールしたと設定されました。 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libx265-30 vlc-plugin-pulse これを削除するには 'apt-get autoremove' を利用してください。 アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 3 個。
インストールすると、zbarimgが使えます。
XXXXXXXXXXXXXやYYYYYYYYYYYYYにはバーコードの数値が並びます。
text.jpgは、書籍の裏表紙にあるバーコードが2つ並んだ部分を切り取ったものを使用しました。
書籍の裏表紙全体での画像でも試しましたが、時間は余計にかかるものの正常にバーコードを認識できました。
zbarimg test.jpg EAN-13:XXXXXXXXXXXXX EAN-13:YYYYYYYYYYYYY scanned 2 barcode symbols from 1 images in 0.11 seconds
ruby-zbarの準備
rubyからzbarを使用する際は、ruby-zbarというgemが使えるようです。
インストールします。
Gemfileに下記を記載して、bundle installすると使えます。
gem 'zbar'
$ bundle install --path vendor/bundle Fetching gem metadata from https://rubygems.org/......... Fetching additional metadata from https://rubygems.org/.. Resolving dependencies... Using rake 10.3.2 Using i18n 0.6.11 Using json 1.8.1 Installing zbar 0.2.2 Your bundle is complete! It was installed into ./vendor/bundle Post-install message from zbar: zbar: This gem depends on the "zbar" C library. If it's not installed, `require "zbar"` will fail.
試しに実行してみたところ、下記のようなメッセージが表示されました。
require 'zbar' ZBar::Image.from_jpeg(File.read('test.jpg')).process #=> JPEG datastream contains no image #=> Your libzbar has a JPEG bug. Some images will fail to process correctly. #=> See: https://github.com/willglynn/ruby-zbar/blob/master/lib/zbar/jpeg.rb #=> Corrupt JPEG data: premature end of data segment
表示されているURLを見ると、zbarのjpegの扱いでバグがあるということが書いてありました。
パッチ当てて、ソースからコンパイルしてと、書いてあったので、ソースから再インストールします。
ちなみにこちらを見ると、
Homebrewではマージされていて、Ubuntuでは保留されているようです。
とりあえず、apt-getで入れたものを削除
$ sudo apt-get remove libzbar0
ソースをダウンロード
cd /usr/local/src/ apt-get source libzbar0 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 'libzbar0' の代わりに 'zbar' をソースパッケージとして選出しています 注意: 'zbar' パッケージは以下の場所の 'Git' バージョン制御システムで保守されています: git://git.recluse.de/debian/pkg-zbar.git 735 kB のソースアーカイブを取得する必要があります。 取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe zbar 0.10+doc-9build1 (dsc) [2,637 B] 取得:2 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe zbar 0.10+doc-9build1 (tar) [714 kB] 取得:3 http://jp.archive.ubuntu.com/ubuntu/ trusty/universe zbar 0.10+doc-9build1 (diff) [17.7 kB] 735 kB を 0秒 で取得しました (994 kB/s) gpgv: 2013年10月22日 18時33分32秒 JSTにRSA鍵ID 7D86500Bで施された署名 gpgv: 署名を検査できません: 公開鍵が見つかりません dpkg-source: warning: failed to verify signature on ./zbar_0.10+doc-9build1.dsc dpkg-source: info: extracting zbar in zbar-0.10+doc dpkg-source: info: unpacking zbar_0.10+doc.orig.tar.gz dpkg-source: info: applying zbar_0.10+doc-9build1.diff.gz
パッチを当てる
config
./configure --with-x=no --without-gtk --without-qt --disable-video --without-python --without-xshm --without-xv configure: error: in `/usr/local/src/zbar-0.10': configure: error: Unable to find ImageMagick >= 6.2.6: No package 'MagickWand' found * Ensure that you installed any "development" packages for ImageMagick. * Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. * You may set the environment variables MAGICK_CFLAGS and MAGICK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. * To avoid using ImageMagick altogether you may add the --without-imagemagick flag to the configure command; the zbarimg program will not be built. See `config.log' for more details.
ImageMagickが見つからないと怒られたので入れました。
sudo apt-get install imagemagick libmagickcore-dev libmagickwand-dev
もう一度
$ ./configure --with-x=no --without-gtk --without-qt --disable-video --without-python --without-xshm --without-xv checking for a BSD-compatible install... /usr/bin/install -c 〜中略〜 config.status: executing doc/reldate.xml commands please verify that the detected configuration matches your expectations: ------------------------------------------------------------------------ X --with-x=disabled pthreads --enable-pthread=yes v4l --enable-video=no => zbarcam video scanner will *NOT* be built jpeg --with-jpeg=yes Magick++ --with-imagemagick=yes Python --with-python=no GTK+ --with-gtk=no => the GTK+ widget will *NOT* be built Qt4 --with-qt=no => the Qt4 widget will *NOT* be built
今度は通ったので、make
$ sudo make make all-am make[1]: ディレクトリ `/usr/local/src/zbar-0.10' に入ります /bin/bash ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I./include -I./zbar -I./include -Wall -Wno-parentheses -g -O2 -MT zbar/zbar_libzbar_la-scanner.lo -MD -MP -MF zbar/.deps/zbar_libzbar_la-scanner.Tpo -c -o zbar/zbar_libzbar_la-scanner.lo `test -f 'zbar/scanner.c' || echo './'`zbar/scanner.c libtool: compile: gcc -DHAVE_CONFIG_H -I. -I./include -I./zbar -I./include -Wall -Wno-parentheses -g -O2 -MT zbar/zbar_libzbar_la-scanner.lo -MD -MP -MF zbar/.deps/zbar_libzbar_la-scanner.Tpo -c zbar/scanner.c -fPIC -DPIC -o zbar/.libs/zbar_libzbar_la-scanner.o In file included from /usr/include/stdio.h:937:0, from zbar/debug.h:60, from zbar/scanner.c:34: /usr/include/x86_64-linux-gnu/bits/stdio2.h:140:1: error: expected identifier or ‘(’ before ‘{’ token {
結局、このmake時のエラーが解決できない状況です。
今度、違う環境で試してみます。
参考サイト
ZBar でバーコード読み取り « Stop Making Sense
ZBar bar code readerを使って画像からバーコードを読み取ってPHPで表示してみるまで | aguuu