바코드 및 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
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)
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 코드들을 가지고 주소를 알아내보자.
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 코드를 디코드 해서 표시를 하고, 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 코드에 박스와 주소를 적어준다.