본문 바로가기

개발이야기

Zbar , OpenCV 사용해서 QR코드 인식하기

안녕하세요

이번주에는 회사에서 작업했었던 내용을 포스팅해보려합니다

1. Zbar ?

Zbar는 비디오 스트림, 이미지 파일 및 이미지와 같은 다양한 소스에서 바코드를 판독 할 수있는 오픈 소스 라이브러리입니다

Home : http://zbar.sourceforge.net/

github : https://github.com/ZBar/ZBar

오늘은 python 으로  Zbar와 OpenCV 를 사용하여 이미지에서 QR코드를 인식하는 프로그램을 개발해보려합니다

2. Install Zbar , OpenCV

Zbar를 설치해줍니다

  pip install zbar-py

OpenCV 도 설치해줍니다 , 저는 비교적 가벼운 headless 버전을 설치해보았습니다

pip install  opencv-python-headless

3. OpenCV 사용해서 QR코드 인식 해보기

인식에 사용할 QR코드 이미지입니다

OpenCV에서 제공하는 QRCodeDetector 를 사용해서 이미지에서 QR코드를 찾아내고

Decode 해주는 코드입니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -*- coding: utf-8 -*- 
 
import cv2
import numpy as np
 
 
 
inputImage = cv2.imread("image/QR2.jpg")
inputImage = cv2.resize(inputImage, None, fx=0.2, fy=0.2, interpolation=cv2.INTER_AREA)
 
qrDecoder = cv2.QRCodeDetector()
 
# QR코드를 찾고 디코드해줍니다
data,bbox,rectifiedImage = qrDecoder.detectAndDecode(inputImage)
if len(data)>0:
    print("Decoded Data : {}".format(data))
    rectifiedImage = np.uint8(rectifiedImage)
 
else:
    print("QR Code not detected")
 

 

결과값:

 

4. Zbar를 사용해서 QR코드 인식 해보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: utf-8 -*- 
 
import zbar
import cv2
 
file_path = "image/QR2.jpg"
 
# Zbar 라이브러리로 QR코드를 인식하기위해서 opcnCV로 이미지를 그레이 스케일로 읽어옵니다
 
 
qrcode_data = ""
 
#Zbar는 다중 QR 검출도 가능합니다
#인식된 QR 데이터들을 가져옵니다
scanner = zbar.Scanner()
results = scanner.scan(im)
for result in results:
    qrcode_data = result.data
 
# QR 코드가 인식이 되지 않았다면
# QR Code not detected
if(qrcode_data=="null"):
    print("QR Code not detected")
else:
    # QR 코드가 인식이 되었다면
    # 인식된 QR 코드의 데이터를 출력해준다
   print("Decoded Data : {}".format(qrcode_data))
  
         
 

 

결과값:

5. 성능 비교 해보기

위의 결과를 보니 둘다 인식이 잘 되는 것 같습니다

그렇다면 어느 라이브러리가 좀 더 인식을 잘 하는지 여러 이미지로 비교 해봅시다

왼쪽부터 1, 2, 3 번 이미지

이미지 인식 결과

1번  

-> OpenCV : QR Code not detected  

-> Zbar : 

2번

-> OpenCV : QR Code not detected  

-> Zbar : 

3번도 2번과 마찬가지로 Zbar 는 인식에 성공했지만 OpenCV는 실패했습니다

6. 마치며

위의 테스트의 결과가 왜 이렇게 나왔는지는 궁금하지만 개발 일정이 빠듯한 관계로 자세히는 찾아보지 못했습니다

사실 QR코드 인식을 지원하는 라이브러리는 위의 2개 말고도 많습니다

하지만 성능이 좋고 멀티 QR인식도 되는 Zbar와 오랜 역사를 가지고있는 OpenCV 를 사용하여 둘의 성능의 차이를 눈으로 한번 확인해보고 싶었습니다

현재는 Zbar와 OpenCV 를  Docker에 올려  AWS Lambda 를 사용하여 개발을 하고있습니다

Lambda에 Zbar를 올리기위해 많은 시간들여 삽질을 했고 이에 대해 포스팅을 하고 싶었으나

글이 굉장히 길어져서 한번에 읽기 힘들어질것같아 나눠서 포스팅을 해보려합니다

다음에는 Docker에 Zbar 와 OpenCV 를 설치해서 실행시켜보는 내용으로 포스팅을 해보겠습니다

감사합니다