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

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 코드를 디코딩하는 방법을 아는 사람이 있습니까? 모든 팁을 환영합니다!



답변

다음 단계와 코드를 사용하여 시도 할 수 있습니다 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
    


답변

다음 코드는 저에게 잘 작동합니다.

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


답변

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

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

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

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


답변

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/


답변

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)에서 테스트 및 작동


답변