Python에서 QR 코드 이미지를 디코딩하는 방법은 무엇입니까?


88

TL; DR : (선호하는 순수) Python을 사용하여 이미지 파일에서 QR 코드를 디코딩하는 방법이 필요합니다.

Python을 사용하여 디코딩하려는 QR 코드가있는 jpg 파일이 있습니다. 나는 이것을 주장하는 몇 개의 라이브러리를 찾았습니다.

PyQRCode ( website here )는 다음과 같은 경로를 제공하여 이미지에서 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참조 한다고 생각하기 때문에 다소 혼란 스러웠습니다. 그래서 위의 코드를 및 둘 다로 시도 했지만 둘 다 두 번째 줄에서 실패합니다 . 또한 웹 사이트 는 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."Mac OSX 실행에 설치해 보았습니다 sudo pip install zbar. 이것은 error: command 'cc' failed with exit status 1. 나는 이 질문 에 대한 답변에서 제안을 시도했지만 해결할 수없는 것 같습니다. 그래서 다시 진행하기로 결정했습니다.

이 블로그 게시물 에 따르면 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-qrtools, qr-tools, python-qrtools하지만 불행히도 아무 소용이, 그리고 몇 개 조합. ZBar를 기반으로한다고 말하는 이 repo 를 참조한다고 가정합니다 (위 참조). 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 ( website here )은 인기있는 Java ZXing 라이브러리 의 Python 포트로 추정 되지만 초기 및 유일한 커밋은 6 년이 지났으며 프로젝트에는 readme 또는 문서가 전혀 없습니다.

나머지를 위해 몇 개의 qr -en coder ( de coder가 아님)와 디코딩 할 수있는 API 끝점을 찾았습니다 . 이 서비스가 다른 API 끝점에 종속되는 것을 원하지 않기 때문에 디코딩을 로컬로 유지하고 싶습니다.

결론적으로 (순수한) Python의 이미지에서 QR 코드를 디코딩하는 방법을 아는 사람이 있습니까? 모든 팁을 환영합니다!


'if myCode.decode ( "/ home / kramer65 / qrcode.jpg")'여야하며 'QR (filename ='/ home / kramer65 / qrcode.jpg ')'가
아닙니다.

설치 에 대해 @ kramer65 가 제기 한 후속 질문을 언급 할 가치가 있다고 생각합니다 . stackoverflow.com/questions/27406641/…zbarpip
Ian

답변:


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
    • 이제 파이썬 프롬프트에서 다음 코드를 사용하십시오.

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

다음은 단일 실행의 전체 코드입니다.

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가 필요하므로 순수한 파이썬이 아니지만 실제로 작동합니다. 주요 문제는 이제 heroku에 zbar python 바인딩을 설치해야한다는 것 입니다. 여기에 대한 질문은 stackoverflow.com/questions/27406641/… 입니다. 나는 당신의 대답을 받아 들일 것입니다. 그러나 당신이 제 다른 질문도 봐 주셔서 제가 heroku에서 qrtools를 실행하는 것을 해결할 수 있도록 해주시면 대단히 감사하겠습니다. 정말 감사합니다!
kramer65 dec.

3
이것은 작동하지 않고 예외를 제공합니다. tostring ()이 제거되었습니다.
Bhishan Poudel

2
@BhishanPoudel 나는 이것을 만났다. 버그가 수정 된 것으로 보이며 다음 릴리스에 나타날 것입니다. 이 문제가 발생하는 사람은 /usr/lib/python2.7/dist-packages/qrtools.py (위치는 다를 수 있음)의 181 행을 편집하고 "tostring"을 "tobytes"로 바꿀 수 있습니다. 지금은 잘 실행되고 있습니다.
jonthalpy

5
작동하지 않습니다. AttributeError는 : 모듈 'qrtools은'더 속성 'QR'가 없다
사이드 Mohtasham

1
시도 @SaeedMohtashamfrom qrtools import qrtools
Krenair

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 && 핍 이미지를 설치
asad_hussain

6

나는 zbar설치 에 관한 질문의 일부에만 대답하고 있습니다.

Windows + Python 2.7 64 비트에서 작동하도록하는 데 거의 30 분을 보냈 으므로 다음은 허용되는 답변에 대한 추가 참고 사항입니다.

추신 : Python 3.x에서 작동하도록 만드는 것은 훨씬 더 어렵습니다. Python 3.x 용 zbar를 컴파일하십시오 .

PS2 : 방금 pyzbar 를 테스트 했는데pip install pyzbar 훨씬 더 쉽고 기본적 으로 작동합니다 (유일한 것은 VC Redist 2013 파일을 설치해야한다는 것입니다). 이 pyimagesearch.com 문서 에서이 라이브러리를 사용하는 것이 좋습니다 .


1

Windows의 경우 ZBar

전제 조건 :

  • 다음 중 하나를 사용하여 ZBar를 설치합니다.
  • pip install pyzbar

디코딩하려면 :

from PIL import Image
from pyzbar import pyzbar

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

또는 ZBarLight여기에 언급 된대로 설정 하여 사용해 볼 수도 있습니다 :
https://pypi.org/project/zbarlight/


0

ZBar 및 다른 라이브러리보다 낫다고 주장하는 BoofCV 라는 라이브러리가 있습니다.
이를 사용하는 단계는 다음과 같습니다 (모든 OS).

전제 조건 :

  • JDK 14+가 설치되고 $ 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.