Skip to main content

QR code reader in Python

ยท 5 min read
Serhii Hrekov
software engineer, creator, artist, programmer, projects founder

Python QR code reader from image or How to decode a QR-code image in python?โ€‹

Decoding a QR code from an image in Python is primarily achieved using the pyzbar library, which reads various bar codes and QR codes 1, 2.

Installationโ€‹

You'll need the pyzbar library to perform the decoding and Pillow (PIL) to load and handle the image file 1.

pip install pyzbar pillow

Note: Depending on your operating system, pyzbar may require a system dependency called zbar. If you encounter installation errors, you may need to install the zbar development libraries for your specific OS (e.g., search for install libzbar-dev or similar) 1.


Python code example: decode image fileโ€‹

This script uses Pillow to open the image and passes it to pyzbar for decoding.

from PIL import Image
from pyzbar.pyzbar import decode

def decode_qr_code(image_path):
"""
Decodes QR codes from a given image file path.

Args:
image_path (str): The path to the QR code image file (e.g., 'my_qr.png').

Returns:
list: A list of decoded results, or an empty list if no QR code is found.
"""
try:
# 1. Open the image using Pillow
img = Image.open(image_path)

# 2. Decode the QR code(s) in the image 1, 2.
decoded_objects = decode(img)

if not decoded_objects:
print(f"No QR code found in the image: {image_path}")
return []

print(f"--- Decoded Results for {image_path} ---")
results = []
for obj in decoded_objects:
# The data is returned as bytes, so we decode it to a string (UTF-8)
data = obj.data.decode('utf-8')
code_type = obj.type

print(f"Type: {code_type}")
print(f"Data: {data}")

results.append({
'type': code_type,
'data': data,
'rect': obj.rect
})

return results

except FileNotFoundError:
print(f"Error: The file was not found at {image_path}")
return []
except Exception as e:
print(f"An unexpected error occurred: {e}")
return []

# Example usage:
# Make sure you have a QR code image named 'my_qr_code.png' in the same directory.
image_file = 'my_qr_code.png'
decoded_data = decode_qr_code(image_file)

Decoding from a numpy array (for OpenCV)โ€‹

If you are working with real-time video or complex image processing using OpenCV (cv2), the image will be loaded as a NumPy array. pyzbar can decode directly from a NumPy array as well 2.

import cv2
from pyzbar.pyzbar import decode
import numpy as np

def decode_qr_from_cv2_image(numpy_image: np.ndarray):
"""
Decodes QR codes from an image loaded as a NumPy array (e.g., from OpenCV).
"""
# The decode function works directly with the NumPy array 2.
decoded_objects = decode(numpy_image)

if decoded_objects:
for obj in decoded_objects:
# Decode byte data to string
data = obj.data.decode('utf-8')
print(f"Decoded data: {data}")
print(f"Code type: {obj.type}")
return [obj.data.decode('utf-8') for obj in decoded_objects]
else:
print("No QR code found in the image array.")
return []

# Example usage with OpenCV (requires: pip install opencv-python numpy)
# Load an image using cv2
# img = cv2.imread('my_qr_code.png')
# if img is not None:
# decode_qr_from_cv2_image(img)

Sources and further readingโ€‹