본문 바로가기

컴퓨터/Python

도서 바코드 사진 인식 프로그램

앞선 내용에서 바코드 사진을 인식해서 바이너리 데이터로 변환하는 과정을 거쳤다. 그래서 이번 내용에서는 Python으로 작성한 바코드 사진 인식 프로그램 소스코드를 소개하려고 한다. 인식 방법에 대한 간단한 알고리즘의 설명은 이미 앞선 강의에서 살펴보았으니 이 포스팅에서는 직접 제작한 소스코드만 첨부하도록 하겠다.


Python에서 이미지를 관리하는 module이 기본적으로는 제공하지 않기 때문에, PIL 모듈을 설치해서 사용하였다.


PIL 모듈을 설치하는 방법은 pip를 이용해서 간단하게 설치할 수 있으므로 따로 설명은 하지 않도록 하겠다. 여기서의 경우 도서 바코드 사진이 있는 링크의 주소를 입력하면 해당하는 이미지에서 바코드의 바이너리 데이터 정보를 리턴해주는 형태로 구현하였다. 만약 이미지로 사용하고자 한다면 getImage 함수에서 첫 번째 줄에 들어있는 request.urlopen(url).read()부분을 파일을 byte형식으로 읽어온 값으로 대체해주면 된다.

아직은 Prototype에 해당하는 소스코드이기 때문에 오직 바코드만 들어있는 이미지를 불러와야 하며, 평행이 아니게 사진이 찍힌 경우에는 잘 인식하지 못한다는 단점이 있다.

이러한 단점들은 OpenCV를 사용하면 해결할 수 있을 것으로 생각되어지며, 나중에 직접 구현을 해보아야겠다.


# -*- coding: utf-8 -*-
from io import BytesIO
from PIL import Image
from urllib import request
import re

regex = re.compile("^(!+)(\s+)(!+)(\s+.*\s+)(!+)(\s+)(!+)$")

def getImage(url):
	im = Image.open(BytesIO(request.urlopen(url).read())).convert('L')
	
	load_data = im.load()
	(width,height) = im.size
	i = int(height/2)
	d =""
	for j in range(width):
		if load_data[j,i]<230:
			d+="!"
		else:
			d+=" "
	return d.strip()

def getBytesData(url):
	data = getImage(url)
	one_len = 7
	try:
		t=regex.findall(data)[0]
		size = round((len(t[0])+len(t[1])+len(t[2])+len(t[-3])+len(t[-2])+len(t[-1]))/6)
		str_data = t[3]
		str_data = str_data.replace("!"*size, "1").replace(" "*size, "0")
		str_data = str_data[:6*one_len] + str_data[-6*one_len:]
		return str_data
	except IndexError:
		print("ERROR!")
		return None