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


88

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ん)。qrコードイメージしか生成できないこのライブラリqrcode参照していると思うので、ちょっと混乱しました。両方で上記のコードを試してみました私はそうと、しかし言って二行目で失敗の両方。さらに、このWebサイトはUbuntu 8.10(6年以上前にリリースされた)を参照しており、最新のコミットを確認するためのパブリック(gitまたはその他の)リポジトリが見つかりません。それで私は次の図書館に移りました:pyqrcodeqrcodeAttributeError: 'module' object has no attribute 'Decoder'

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

QRToolsはこのブログ投稿によると、次のコードを使用して画像を簡単にデコードできます。

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カップルより多くの組み合わせが、残念ながら無駄に。私はそれが参照すると仮定し、このレポそれは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ここのウェブサイト)はおそらく人気のあるJavaのPythonポートです ZXingライブラリのが、最初の唯一のコミットは6年前であり、プロジェクトにはreadmeやドキュメントがまったくありません。

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

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


'if myCode.decode( "/ home / kramer65 / qrcode.jpg")'ではなく 'QR(filename =' / home / kramer65 / qrcode.jpg ')'
Dmitry Chichkov

私はそれがによってもたらされるフォローアップの質問言及する価値があると感じ@ kramer65インストールについてzbarpipstackoverflow.com/questions/27406641/...
イアン・

回答:


109

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

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

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

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

    • qrtools使用してインストールsudo apt-get install python-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
    

1
こんにちはムー無、あなたの答えをありがとう。qrtoolsはzbarを必要とするため、純粋なpythonではありませんが、実際に機能するようになりました。主な問題は、zbarpythonバインディングをherokuにインストールする必要があることです。これについてここで質問しました:stackoverflow.com/questions/27406641/…。私はあなたの答えを受け入れるつもりですが、herokuで実行されているqrtoolsを解決できるように、他の質問もご覧いただければ幸いです。どうもありがとう!
kramer65 2014

3
これは機能せず、例外が発生します:tostring()は削除されました。
Bhishan Poudel 2016年

2
@BhishanPoudel私もこれに遭遇しました。バグは修正されたようで、次のリリースで表示されるはずです。これに遭遇した人は、/ usr / lib / python2.7 / dist-packages / qrtools.pyの181行目を編集して(場所は異なる場合があります)、「tostring」を「tobytes」に置き換えることができます。今はうまく動いています。
jonthalpy 2016年

5
動作しません。AttributeError:モジュール 'qrtools'には属性 'QR'がありません
SaeedMohtasham18年

1
@SaeedMohtasham tryfrom qrtools import qrtools
Krenair 2018年

11

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

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)])]

仕事に上記溶液のために、uがまたpypng && PIP画像インストールピップのインストールを実行する必要があります
asad_hussain

6

zbarインストールに関する質問の一部のみに回答しています。

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、あなたはしますただインストールする必要がVS 2013のVisual C ++再頒布可能パッケージ(私は...失敗した再コンパイルしようとすると、ここで多くの時間を費やしました)

  • 必須:libzbar64-0.dllは、PATHにあるフォルダーにある必要があります。私の場合は、「C:\ Python27 \ libzbar64-0.dll」(PATHにあります)にコピーしました。それでも機能しない場合は、次を追加します。

    import os
    os.environ['PATH'] += ';C:\\Python27' 
    import zbar
    

PS:Python3.xで動作させるのはさらに難しいです:Python3.x用にzbarをコンパイルしますます。

PS2:pyzbarをテストしたところpip install pyzbarはるかに簡単で、すぐに使用できます(VC Redist 2013ファイルをインストールする必要があるだけです)。このpyimagesearch.comの記事このライブラリを使用することもお勧めします。


1

を使用するWindowsの場合 ZBar

前提条件:

デコードするには:

from PIL import Image
from pyzbar import pyzbar

img = Image.open('My-Image.jpg')
output = pyzbar.decode(img)
print(output)

または、httpsZBarLight//pypi.org/project/zbarlight/に記載されているように設定して使用することもでき
ます。


0

ZBarや他のライブラリよりも優れていると主張するBoofCVというライブラリがあります
これを使用する手順は次のとおりです(任意のOS)。

前提条件:

  • JDK14 +がインストールされて$ PATHに設定されていることを確認します
  • pip install pyboof

デコードするクラス:

import os
import numpy as np
import pyboof as pb

pb.init_memmap() #Optional

class QR_Extractor:
    # Src: github.com/lessthanoptimal/PyBoof/blob/master/examples/qrcode_detect.py
    def __init__(self):
        self.detector = pb.FactoryFiducial(np.uint8).qrcode()
    
    def extract(self, img_path):
        if not os.path.isfile(img_path):
            print('File not found:', img_path)
            return None
        image = pb.load_single_band(img_path, np.uint8)
        self.detector.detect(image)
        qr_codes = []
        for qr in self.detector.detections:
            qr_codes.append({
                'text': qr.message,
                'points': qr.bounds.convert_tuple()
            })
        return qr_codes

使用法:

qr_scanner = QR_Extractor()
output = qr_scanner.extract('Your-Image.jpg')
print(output)

Python 3.8(WindowsおよびUbuntu)でテストおよび動作

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.