kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

rubyからzbarを扱う on Ubuntu

rubyからZBar bar code readerを利用して、画像バーコードからISBNコードを取得するということがやりたかったのですが、
結果うまく行きませんでした。

  1. Uubuntu14.04
  2. ruby 2.1.2
  3. 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