Help us understand the problem. What is going on with this article?

Pythonで画像ファイルからQRコードを読み込む (MacOS)

More than 5 years have passed since last update.

ZBar とPythonモジュール https://pypi.python.org/pypi/zbar/ を利用します。
QRコード以外のバーコードにも対応しています。

紙のカードを使った実験結果の集計を効率化するために、あらかじめカードにQRコードを仕込んでおき、スキャン後にPythonで自動処理する、ということをやったのでメモ。

環境、バージョン

インストール

ZBar

Homebrewで一発インストール。

$ brew install zbar

Python zbarモジュール

これもPyPIで一発インストール、と行きたいのですが、そのまま入れてしまうとインポート時にSegmentation faultでPythonが死にます。

$ pip install zbar

$ python
Python 2.7.9 (default, Jan  7 2015, 11:50:42) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import zbar
Segmentation fault: 11

$ pip uninstall zbar

そこで、ソースコードにパッチをあててインストールします。
このパッチでは、配列にsentinelを追加してあげることで、Segmantation faultの発生を防いでいます。

$ wget https://pypi.python.org/packages/source/z/zbar/zbar-0.10.tar.bz2
$ wget https://github.com/npinchot/zbar/commit/d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.diff
$ tar jxvf zbar-0.10.tar.bz2
$ cd zbar-0.10
$ patch -p1 < ../d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.diff
patching file imagescanner.c
$ python setup.py install

$ python
Python 2.7.9 (default, Jan  7 2015, 11:50:42) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import zlib
>>>

今度は大丈夫でした。

Python Pillowモジュール

PyPI一発で入ります。

$ pip install Pillow

画像ファイルからQRコードを抽出する

Pythonのテストコードです。

zbar_test.py

zbar_test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

### cf. http://99blues.dyndns.org/blog/2010/12/zbar/

import sys
import zbar
import PIL.Image

if len(sys.argv) < 2: exit(1)

# create a reader
scanner = zbar.ImageScanner()

# configure the reader
scanner.parse_config('enable')

# obtain image data
pil = PIL.Image.open(sys.argv[1]).convert('L')
(width, height) = pil.size
raw = pil.tostring()

# wrap image data
image = zbar.Image(width, height, 'Y800', raw)

# scan the image for barcodes
scanner.scan(image)

# extract results
for symbol in image:
    # do something useful with results
    print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data

# clean up
del(image)
$ ./zbar_test.py /path/to/image.jpg
decoded QRCODE symbol "http://www.example.com/"

参考

kiyota-yoji
京都大学にて自然言語処理分野の研究室に1997年に配属されて以来、対話システム、テキストマイニング、情報推薦、画像処理など、コンピュータ科学および人工知能(AI)周辺の研究開発に一貫してかかわってきました。東京大学に助教として在籍中の2007年に東京大学発スタートアップ(株)リッテルを共同創業し、企業買収により2011年よりLIFULLにて不動産テック分野の研究開発にたずさわっています。
https://www.kiyota-yoji.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした