Dans cet article, nous allons voir comment détecter et lire un code barre ou un Qr Code en utilisant la bibliothèque ZBar. Bien que cette librairie soit assez ancienne (la dernière mise à jour date de 2013), elle reste l’une des meilleures pour la détection et la lecture de code bar.

Comment détecter et lire un code avec Zbar ?

Lors de cet article, nous aurons donc besoin de la librairie OpenCV, ainsi que bien évidemment de la librairie ZBar.

Si vous ne disposez pas de machine avec OpenCV, je vous invite à consulter cette page, afin de procéder à son installation.

Étape 1: Installer ZBar

Pour commencer, nous aurons besoin d’installer ZBar. Vous pouvez trouver les instructions d’installation ici.

Pour les utilisateurs sous MacOs:

brew install zbar

Pour les utilisateurs sous Debian (ou Raspbian)

sudo apt-get install libzbar-dev libzbar0

Nous aurons également besoin de la librairie pyzbar afin d’utiliser ZBar avec Python 3 car la version de ZBar ne prend par en charge python 3.

pip3 install pyzbar

Tout est prêt, nous pouvons passer à l’utilisation de ZBar.

Étape 2: Utilisation de ZBar avec OpenCV

Nous commençons par importer la bibliothèque pyzbar (l. 1), ainsi que la bibliothèque OpenCV (l. 2). Puis nous ouvrons une image (l. 4).

Image contenant un Qrcode et un code barre à détecter avec ZBar
Image contenant des codes (disponible ici)

Il est maintenant temps de localiser et décoder les codes présents dans l’image. Pyzbar vient avec une fonction decode qui permet de localiser et de décoder automatiquement les codes présents dans une image. Nous n’auront donc par besoin de les localiser avec OpenCV auparavant et nous appelons cette fonction à la ligne 5.

import pyzbar.pyzbar as pyzbar
import cv2

img = cv2.imread('Codes.jpg')
Codes = pyzbar.decode(img)

La fonction decode renvoi une liste contenant les différents codes. Pour chaque code, nous pouvons obtenir sa localisation, le type de code et enfin les données qu’il contient.

Nous commençons par récupérer la position des codes (l.8). Puis, nous stockons dans la variable points la liste des points correspondant aux angles des codes. Enfin, nous récupérons ensuite les données de chaque code ligne 9. Ces données sont de types ‘bytes’, nous allons les convertir en ‘string’ en utilisant la fonction .decode(« utf-8 »).

Nous n’avons pas besoin de connaître le type de données de ces codes (QR code, code EAN 8, code 128, …), mais si vous en avez besoin, vous pouvez l’obtenir avec type=code.type.

for code in Codes:
	points = code.polygon
	data = code.data.decode("utf-8")

Il ne nous reste plus qu’à afficher les informations sur l’image. Pour ce faire, nous allons avoir besoin de remettre de l’ordre dans les coordonnées . Nous stockons les coordonnées minimales dans la variable pt1 (l. 11) et les coordonnées maximales dans la variable pt2 (l. 12). Ainsi pt1 contiendra les coordonnées du coin supérieur gauche du code et pt2 contiendra celles du coin inférieur droit.

Il nous reste plus qu’à tracer le rectangle encadrant le code à la ligne 14 et à insérer le texte correspondant sous le code (l. 15).

Finalement, il ne reste plus qu’à afficher l’image, grâce aux lignes 17-18.

	pt1=(min(points[0][0],points[2][0]),min(points[0][1],points[2][1]))
	pt2=(max(points[0][0],points[2][0]),max(points[0][1],points[2][1]))
	
	cv2.rectangle(img, pt1, pt2,(0,0,255),3)
	cv2.putText(img,data , (pt1[0],pt2[1]+30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255),2)

cv2.imshow('decode',img)
cv2.waitKey(0)

Résultat

Resultat de la détection de code barre et de QrCode grâce à l'utilisation de Zbar et OpenCV
Résultat de la détection

Et voilà! Nous avons vu dans cet article comment utiliser la bibliothèque Zbar avec OpenCV afin de lire un code, que ce soit un code barre ou un Qr Code.

Catégories : Image Processing

0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.