바코드, QR 생성 및 판독

김성빈·2024년 5월 22일
0

Modern Computer Vision

목록 보기
35/117

바코드 및 QR 코드를 디코딩,인코딩하기 위해 라이브러리를 설치

# 이 라이브러리는 바코드를 생성하는 기능을 제공
# [images] 옵션은 이미지 처리를 위해 필요한 추가 의존성을 설치
!pip install python-barcode[images] 

# QR 코드를 생성하는 기능을 제공
!pip install qrcode

# 바코드 및 QR 코드를 스캔하고 해독하는 오픈 소스 도구
!apt install libzbar0

# Python에서 바코드 및 QR 코드를 스캔하고 해독하기 위한 간단한 인터페이스를 제공
!pip install pyzbar

pyzbar 라이브러리는 libzbar0의 python 바인딩인데,

여기에서 python 바인딩 이라는 말은 다른 프로그래밍 언어로 작성된 라이브러리나 도구를 Python에서 사용할 수 있도록 하는 인터페이스나 래퍼를 의미한다.

바코드

바코드 종류

EAN-8
EAN-13
EAN-14
UPC-A
JAN
ISBN-10
ISBN-13
ISSN
Code 39
Code 128
PZN

바코드 인코드 : EAN-13

from barcode import EAN13
from barcode.writer import ImageWriter

with open('barcode.png', 'wb') as f:
    EAN13('123456789102', writer=ImageWriter()).write(f)

barcode = cv2.imread("barcode.png")
imshow("Barcode", barcode)

바코드 디코드

이번엔 책의 바코드를 디코드 해보겠다.

from pyzbar.pyzbar import decode

image = cv2.imread("1024px-ISBN.jpg")

# Detect and decode the qrcode
barcodes = decode(image)

# loop over the detected barcodes
for bc in barcodes:
  # Get the rect coordiantes for our text placement
  (x, y, w, h) = bc.rect
  cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 3)

  # extract the string info data and the type from our object
  barcode_text = bc.data.decode()
  barcode_type = bc.type

  # show our 
  text = "{} ({})".format(barcode_text, barcode_type)
  cv2.putText(image, barcode_text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
  cv2.putText(image, barcode_type, (x+w, y+h - 15), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
  print("Barcode revealed: {}".format(barcode_text))
  print("Barcode revealed: {}".format(barcode_text))

# display our output
imshow("QR Scanner", image, size = 16)

QR 코드

QR 코드 생성(인코드)

import qrcode
from PIL import Image

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)

qr.add_data("https://wwww.youtube.com")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save("qrcode.png")

qrcode = cv2.imread("qrcode.png")
imshow("QR Code", qrcode, size = 4)

add_data에 내가 원하는 주소를 넣으면 qr 코드가 생성이 되고

저 QR 코드를 찍으면 실제로 youtube가 나온다.

QR 코드 (디코드) - 1

생성을 해봤다면, 이제 생성된 QR 코드들을 가지고 주소를 알아내보자.

from pyzbar.pyzbar import decode
from PIL import Image

img = Image.open('qrcode.png')
result = decode(img)
for i in result:
    print(i.data.decode("utf-8"))

아까 생성한 qrcode.png를 decode해서 프린터로 출력해보니,

add_data에 넣었던 youtube 주소가 출력된다.

QR 코드 (디코드) - 2

직접 촬영된 사진으로 디코드를 해서 표시하는 코드도 작성해보자.

해당 사진의 qr 코드를 디코드 해서 표시를 하고, qr 코드의 주소를 출력한다.

from pyzbar.pyzbar import decode

image = cv2.imread("1DwED.jpg")

# qr코드를 검출하고 해독
codes = decode(image)
imshow("QR Scanner", image, size = 6)
# 탐지된 바코드를 훑어보다
for bc in codes:
  # Get the rect coordiantes for our text placement
  (x, y, w, h) = bc.rect
  print(bc.polygon)
  pt1,pt2,pt3,pt4 = bc.polygon

  # 감지된 QR 코드 위에 경계 상자 출력
  pts = np.array( [[pt1.x,pt1.y], [pt2.x,pt2.y], [pt3.x,pt3.y], [pt4.x,pt4.y]], np.int32)
  pts = pts.reshape((-1,1,2))
  cv2.polylines(image, [pts], True, (0,0,255), 3)

  # extract the string info data and the type from our object
  barcode_text = bc.data.decode()
  barcode_type = bc.type

  # show our 
  text = "{} ({})".format(barcode_text, barcode_type)
  cv2.putText(image, barcode_text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
  cv2.putText(image, barcode_type, (x+w, y+h - 15), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
  print("QR Code revealed: {}".format(text))

# 이미지 출력
imshow("QR Scanner", image, size = 6)

그러면 QR 코드에 박스와 주소를 적어준다.

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글