web-dev-qa-db-ja.com

(できれば純粋な)PythonでQRコード画像をデコードする方法は?

TL; DR:Pythonを使用して(推奨される純粋な)画像ファイルからQRコードをデコードする方法が必要です。

Pythonを使用してデコードしたいQRコードを含むjpgファイルがあります。私はこれを行うと主張するいくつかのライブラリを見つけました:

PyQRCodeここのウェブサイト )これはおそらく、次のようなパスを提供するだけで画像からqrコードをデコードできます:

import sys, qrcode
d = qrcode.Decoder()
if d.decode('out.png'):
    print 'result: ' + d.result
else:
    print 'error: ' + d.error

そこで、Sudo pip install pyqrcodeを使用してインストールしました。ただし、上記のサンプルコードでおかしいのは、qrcodeだけをインポートすることです(ただし、pyqrcodeはインポートしません)。qrcodeこのライブラリ =generateqr-codeイメージのみができます。そこで、上記のコードをpyqrcodeqrcodeの両方で試しましたが、2行目でAttributeError: 'module' object has no attribute 'Decoder'と言って両方とも失敗します。さらに、 ウェブサイト は、Ubuntu 8.10(6年以上前に公開されたもの)を指し、最新のコミットを確認するためのパブリック(gitまたはその他)リポジトリが見つかりません。それで私は次の図書館に移りました。

ZBarウェブサイトはこちら"an open source software suite for reading bar codes from various sources, such as image files."と主張しているので、Sudo pip install zbarを実行しているMac OSXにインストールしてみました。これはerror: command 'cc' failed with exit status 1で失敗します。 this SO question への回答で提案を試みましたが、解決できないようです。だから私は再び先に進むことにしました:

QRTools。これは this blogpost に従って、次のコードを使用して画像を簡単にデコードできます。

from qrtools import QR
myCode = QR(filename=u"/home/psutton/Documents/Python/qrcodes/qrcode.png")
if myCode.decode():
  print myCode.data
  print myCode.data_type
  print myCode.data_to_string()

そこで、Sudo pip install qrtoolsを使用してインストールしようとしましたが、何も見つかりません。また、python-qrtoolsqr-toolspython-qrtools、さらにいくつかの組み合わせを試しましたが、残念ながら役に立ちませんでした。私はそれが this repo を参照していると思う、それはZBarに基づいていると言っている(上記参照)。 Herokuでコードを実行したい(したがって、純粋なPythonソリューションを好む)が、Linuxボックスに(Sudo apt-get install python-qrtoolsを使用して)正常にインストールし、実行してみました。

from qrtools import QR
c = QR(filename='/home/kramer65/qrcode.jpg')
c.data  # prints u'NULL'
c.data_type  # prints u'text'
c.data_to_string()  # prints '\xef\xbb\xbfNULL' where I expect an int (being `1234567890`)

これはデコードされているように見えますが、正しく実行されていないようです。さらにZBarが必要なため、純粋なPythonではありません。そこで、私はさらに別のライブラリを見つけることにしました。

PyXingここのWebサイト )は、おそらくPythonのJavaポートです_ ZXingライブラリ 。ただし、最初の唯一のコミットは6年前であり、プロジェクトにはreadmeやドキュメントが一切ありません。

残りについては、いくつかのqr-enコーダー(deではありませんコーダー)とあなたのためにデコードできるいくつかのAPIエンドポイント。私はこのサービスが他のAPIエンドポイントに依存することを好まないため、デコードをローカルに保ちたいと思います。

結論として(好ましい純粋な)Pythonで画像からQRコードをデコードする方法を知っている人はいますか?すべてのヒントを歓迎します!

69
kramer65

qrtoolsを使用して、次の手順とコードを試すことができます。

  • qrcodeファイルを作成します(まだ存在しない場合)

    • これを行うために pyqrcode を使用しました。これはpip install pyqrcodeを使用してインストールできます
    • そして、コードを使用します:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • qrcode を使用して、既存のqrtoolsファイルをデコードします

    • Sudo apt-get install python-qrtoolsを使用してqrtoolsをインストールします
    • pythonプロンプト内で次のコードを使用します

      >>> import qrtools
      >>> qr = qrtools.QR()
      >>> qr.decode("horn.png")
      >>> print qr.data
      u'HORN O.K. PLEASE.'
      

これが、1回の実行での完全なコードです。

In [2]: import pyqrcode
In [3]: qr = pyqrcode.create("HORN O.K. PLEASE.")
In [4]: qr.png("horn.png", scale=6)
In [5]: import qrtools
In [6]: qr = qrtools.QR()
In [7]: qr.decode("horn.png")
Out[7]: True
In [8]: print qr.data
HORN O.K. PLEASE.

注意事項

  • PyPNGを使用するには、pip install pypngを使用してpyqrcodeをインストールする必要がある場合があります
  • PILがインストールされている場合は、IOError: decoder Zip not availableを取得できます。その場合、 PILのアンインストールと再インストールを試してください

    pip uninstall PIL
    pip install PIL
    
  • それでもうまくいかない場合は、代わりにPillowを使用してみてください

    pip uninstall PIL
    pip install pillow
    
86
mu 無

次のコードは私とうまく機能します:

brew install zbar
pip install pyqrcode
pip install pyzbar

QRコード画像作成の場合:

import pyqrcode
qr = pyqrcode.create("test1")
qr.png("test1.png", scale=6)

QRコードのデコードの場合:

from PIL import Image
from pyzbar.pyzbar import decode
data = decode(Image.open('test1.png'))
print(data)

結果を出力します:

[Decoded(data=b'test1', type='QRCODE', rect=Rect(left=24, top=24, width=126, height=126), polygon=[Point(x=24, y=24), Point(x=24, y=150), Point(x=150, y=150), Point(x=150, y=24)])]
4
Yuiq

私はそれをWindows + Python 2.7 64ビットで動作させるのに30分近く費やしたので、受け入れられた答えへの追加のメモがあります:

  • ダウンロード https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_AMD64.whl

  • pip install zbar-0.10-cp27-none-win_AMD64.whlでインストールします

  • PythonがImportError: DLL load failed: The specified module could not be found.を実行するときにimport zbarを報告する場合、justをインストールする必要があります- VS 2013のVisual C++再頒布可能パッケージ (ここで多くの時間を費やし、再コンパイルに失敗しました...)

  • 必須:libzbar64-0.dllはPATHにあるフォルダーになければなりません。私の場合、「C:\ Python27\libzbar64-0.dll」(パスにあります)にコピーしました

  • それから

    pip install pyqrcode
    pip install qrtools
    pip install Pillow
    

そして、メインの答えからのコードが機能するはずです:

import pyqrcode
qr = pyqrcode.create("HORN O.K. PLEASE.")
qr.png("horn.png", scale=6)
import qrtools
qr = qrtools.QR()
qr.decode("horn.png")
print qr.data
2
Basj