Python + PIL + pyzbar로 바코드(CODE128)/QR코드 인식

0. 테스트환경

[앱]
- React 16
- React native 0.55
- React native camera 현재기준최신
- 갤럭시 S8

[서버]
- Ubuntu 16
- Python 3.6
- Flask 현재기준최신

(코드를 세로로 길게 배치하고 -> 앱에서 사진을 찍어 서버로 전송 -> 서버에서 코드를 인식해서 위에서부터 순서대로 decode해서 리턴함)


1. pyzbar
https://pypi.org/project/pyzbar/에 나와있는대로 설치한다.
인식 자체는 zbar라는 c로 작성된 라이브러리를 사용한다.
pyzbar는 zbar를 Python에서 사용할 수 있게 해주고 추가로 이미지 내 코드 위치를 제공한다.


2. Python image library(PIL)
https://pillow.readthedocs.io/en/3.1.x/installation.html에 나와있는대로 설치한다.
단순 인식이라면 이미지 처리를 할 필요는 없다.
한 파일 내에 raw data가 같은 바코드가 여러개 있으면 첫 번째(위)만 인식돼서 파일을 가로로 n개로 잘라서 사용하기로 했다.


3. 바코드/QR코드 인식
QR코드는 한 이미지 내에서 중복 인식하지만 전체적인 인식률이 낮고,
바코드는 중복 인식이 안되지만 인식률이 높은 것 같다.
아래는 이미지를 불러와 n등분하고 흑백이미지로 만들고 크기를 반으로 줄인
각각의 이미지에서 바코드/QR코드를 찾는 코드이다.

from pyzbar.pyzbar import decode, ZBarSymbol
from PIL import Image

img = Image.open(파일이름)
width, height = img.size
n = (몇 등분 할것인지)
unit = int(height/n)
result = []
for i in range(n):
cropped = img.crop((0, i*unit, width -1, i*unit + unit -1))
cropped = cropped.convert('L').resize((int(width/2), int(unit/2)))
decoded = decode(cropped)


바코드만 찾고 싶다면 decode함수의 인자로 symbols=[ZBarSymbol.CODE128], QR코드만 인식하고 싶다면 symbols=[ZBarSymbol.QRCODE]를 추가하면 된다.
(symbols=[인식할 코드들])

이 블로그의 인기 게시물

Postgresql에서 5432 port가 열려있냐는 문제(Ubuntu 기준)

vue에서 v-html에 포함된 class의 css가 적용되지 않는 경우

Linux screen 명령어 정리