Генерация и распознавание QR‑кодoв на Python

QR‑код (Quick Response) — это матричный штрихкод, в котором хранится закодированная информация. Название подчёркивает быстрое считывание и вместимость данных. QR‑коды встречаются повсеместно: на афишах, в журналах, кинотеатрах, на сайтах, в рекламах и на товарах.
С помощью Python вы можете быстро сгенерировать QR‑код, изменить его внешний вид и расшифровать данные из изображения или с веб‑камеры.
Базовая настройка окружения Python
Рекомендуется использовать изолированное виртуальное окружение для каждого проекта. Это облегчает управление зависимостями и повторяемость сборки.
Создание виртуального окружения
Вы можете создать виртуальное окружение разными способами: virtualenv, venv, conda. Пример ниже использует virtualenv.
- Создайте папку командой mkdir [Folder].
- Перейдите в неё: cd [Folder].
- Создайте окружение: virtualenv [Environment Name].
- Активируйте окружение: [Environment Name]\Scripts\activate (Windows) или source [Environment Name]/bin/activate (Linux/Mac).

Важно: используйте Python 3.6+ для совместимости с современными библиотеками.
Установка необходимых пакетов
Установите пакеты через pip. В примерах используется pip3:
pip3 install opencv-python qrcode numpy ImageЕсли хотите установить пакеты поштучно, выполните:
pip3 install opencv-pythonpip3 install qrcodepip3 install numpypip3 install ImageПримечание: пакет Image иногда заменяют на Pillow (pip install Pillow). Если при импорте возникают ошибки, установите Pillow.
Генерация простого QR‑кода
Создайте файл с расширением .py и вставьте код ниже. Он создаёт изображение QR‑кода для заданной строки.
import qrcode
# Data for which you want to make QR code
# Here we are using the URL of the MakeUseOf website
data = "https://www.makeuseof.com/"
# File name of the QR code Image
# Change it with your desired file name
QRCodefile = "MUOQRCode.png"
# Generating the QR code
QRimage = qrcode.make(data)
# Saving image into a file
QRimage.save(QRCodefile)Этот скрипт создаст файл MUOQRCode.png с QR‑кодом для строки https://www.makeuseof.com/.
Кастомизация QR‑кода
Библиотека qrcode поддерживает множество параметров: цвет заливки, цвет фона, размер ячейки (box size), толщину рамки и версию (version). Ниже — основные опции и примеры.
Изменение размера изображения и размера ячейки
Параметр version задаёт базовый размер матрицы QR‑кода: целое от 1 до 40. Version 1 соответствует матрице 21×21, version 40 — 185×185. Если данных больше, версия увеличится автоматически. box_size задаёт размер пикселей (в точках) для каждой ячейки.
# Importing libraries
import qrcode
import numpy as np
# Data which for you want to make QR code
# Here we are using URL of MakeUseOf website
data = "https://www.makeuseof.com/"
# Name of the QR code Image file
QRCodefile = "CustomisedImgBoxQRCode.png"
# instantiate QRCode object
qrObject = qrcode.QRCode(version=1, box_size=12)
# add data to the QR code
qrObject.add_data(data)
# compile the data into a QR code array
qrObject.make()
image = qrObject.make_image()
image.save(QRCodefile)
# print the image size (version)
print("Size of the QR image(Version):")
print(np.array(qrObject.get_matrix()).shape)Результат — изображение и вывод размера матрицы, например (33, 33).

Size of the QR image(Version):
(33, 33)Изменение цвета заливки
Параметр fill_color задаёт цвет модулей (чёрных квадратиков по умолчанию).
# Importing library
import qrcode
# Data for which you want to make QR Code
# Here we are using URL of MakeUseOf website
data = "https://www.makeuseof.com/"
# Name of the QR Code Image file
QRCodefile = "CustomisedFillColorQRCode.png"
# instantiate QRCode object
qrObject = qrcode.QRCode()
# add data to the QR code
qrObject.add_data(data)
# compile the data into a QR code array
qrObject.make()
image = qrObject.make_image(fill_color="red")
# Saving image into a file
image.save(QRCodefile)
Изменение цвета фона
Параметр back_color задаёт фон изображения.
# Importing library
import qrcode
# Data for which you want to make QR Code
# Here we are using URL of MakeUseOf website
data = "https://www.makeuseof.com/"
# Name of the QR Code Image file
QRCodefile = "CustomisedBGColorQRCode.png"
# instantiate QRCode object
qrObject = qrcode.QRCode()
# add data to the QR code
qrObject.add_data(data)
# compile the data into a QR code array
qrObject.make()
image = qrObject.make_image(back_color="blue")
# Saving image into a file
image.save(QRCodefile)
Изменение толщины рамки
Параметр border задаёт ширину белой рамки вокруг QR‑кода (в ячейках).
# Importing libraries
import qrcode
# Data for which you want to make QR Code
# Here we are using URL of MakeUseOf website
data = "https://www.makeuseof.com/"
# Name of the QR Code Image file
QRCodefile = "CustomisedBorderQRCode.png"
# instantiate QRCode object
qrObject = qrcode.QRCode(border=10)
# add data to the QR code
qrObject.add_data(data)
# compile the data into a QR code array
qrObject.make()
image = qrObject.make_image()
image.save(QRCodefile)
Распознавание QR‑кода из изображения
OpenCV содержит встроенный детектор QR‑кодов. Ниже — пример чтения статического файла и вывода расшифрованных данных.
# Import Library
import cv2
# Name of the QR Code Image file
filename = "MUOQRCode.png"
# read the QRCODE image
image = cv2.imread(filename)
# initialize the cv2 QRCode detector
detector = cv2.QRCodeDetector()
# detect and decode
data, vertices_array, binary_qrcode = detector.detectAndDecode(image)
# if there is a QR code
# print the data
if vertices_array is not None:
print("QRCode data:")
print(data)
else:
print("There was some error")Ожидаемый вывод для примера:
QRCode data:
https://www.makeuseof.com/Распознавание в реальном времени через веб‑камеру
Ниже — пример, который открывает камеру и пытается распознать QR‑код в кадре. Нажмите q для выхода.
import cv2
# initalize the camera
cap = cv2.VideoCapture(0)
# initialize the OpenCV QRCode detector
detector = cv2.QRCodeDetector()
while True:
_, img = cap.read()
# detect and decode
data, vertices_array, _ = detector.detectAndDecode(img)
# check if there is a QRCode in the image
if vertices_array is not None:
if data:
print("QR Code detected, data:", data)
# display the result
cv2.imshow("img", img)
# Enter q to Quit
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()При запуске камера откроется. Поднесите QR‑код к объективу — данные появятся в консоли.
Полезные факты и параметры QR
Факт‑бокс:
- Версии: 1–40 (размеры матриц от 21×21 до 185×185).
- Уровни коррекции ошибок: L (≈7%), M (≈15%), Q (≈25%), H (≈30%). Чем выше уровень, тем больше восстановление повреждённых данных, но тем меньше вместимость.
- Форматы хранения: текст, URL, VCard, Wi‑Fi параметры, геокоординаты и т. д.
Важно: выбор версии и уровня коррекции зависит от объёма данных и ожидаемых условий использования (площадка печати, риск повреждений, сканирование с расстояния).
Когда распознавание может не сработать
- Плохое освещение или сильные блики.
- Сильно искажённый или частично повреждённый код.
- Слишком малая печать или малая плотность (box_size слишком мал).
- Нестандартные цветовые сочетания с низкой контрастностью между заливкой и фоном.
- Неразрешимые наложения графики на область поиска и ориентации.
Альтернативные подходы и библиотеки
Если qrcode + OpenCV не подходят, рассмотрите:
- segno — чистая генерация QR (без зависимостей от Pillow).
- pyqrcode — генерация в SVG/PNG.
- Pillow — для более тонкой постобработки и наложения логотипов.
- zxing (через Java или порт) — иногда лучше распознаёт сложные изображения.
Модель мышления: как подходить к задаче
- Определите конечную цель: код для печати, для экрана, для массовой рассылки.
- Оцените условия: освещённость, возможные повреждения, требуемая вместимость.
- Выберите параметры: version, error_correction, box_size, border.
- Протестируйте: несколько устройств и камер, печатные образцы.
Чек‑лист перед выпуском в продакшен
Для разработчика:
- Автоматизированные тесты генерации/распознавания.
- Проверка цветов в RGB и CMYK для печати.
- Логи расшифровки и метрики успешности сканирования.
Для QA:
- Сканирование на 5 разных телефонах/камерах.
- Тесты при разном освещении и углах наклона.
- Тесты на частично повреждённых кодах.
Для операций:
- Резервные ключи и процесс отката при изменении формата хранения.
- Мониторинг ошибок распознавания.
Мини‑методология разработки: быстрое прототипирование
- Сгенерировать базовый QR с минимальным набором данных.
- Проверить распознавание в локальной среде (файл и камера).
- Добавить кастомизации (цвет, логотип) и повторно протестировать.
- Проводить A/B тесты по читаемости и восприятию пользователями.
Примеры сценариев тестирования
- Кейс: статическое изображение — проверка 100% считывания на стандартной камере.
- Кейс: печать 2×2 см — проходит ли сканирование с 20 см расстояния.
- Кейс: логотип посередине — не мешает ли он обнаружению шаблонов ориентации.
Критерии приёмки:
- Генератор создаёт валидный QR, расшифровываемый всеми тестовыми приложениями.
- Встроенный сканер распознаёт QR в 90% реальных условий (освещение, угол).
Безопасность и конфиденциальность
- Никогда не кодируйте в QR‑коде чувствительные данные в открытом виде (пароли, токены).
- Для передачи секретов используйте короткие одноразовые токены и HTTPS по ссылке.
- Встраивание URL открывает риск фишинга — проверяйте ссылки и используйте превью при сканировании.
Примечание: при работе с персональными данными учитывайте требования конфиденциальности и местное законодательство (например, GDPR для ЕС).
Советы по отладке и оптимизации
- Если OpenCV не распознаёт код, попробуйте повысить контраст, применить пороговую бинаризацию или морфологические операции.
- Для печати проверяйте результат в CMYK и на реальных носителях.
- Для высоконагруженных сервисов кэшируйте сгенерированные изображения.
Совместимость и миграция
- На мобильных устройствах используйте нативные сканеры, если цель — UX; Python‑сканер больше подходит для серверной обработки или DIY‑решений.
- Для миграции формата QR убедитесь, что старые коды остаются читаемыми или обеспечьте редирект/резервный парсер.
Решающее дерево для выбора подхода
flowchart TD
A[Нужно сгенерировать QR?] --> B{Для печати или для экрана?}
B -->|Печать| C[Выбрать высокий уровень коррекции]
B -->|Экран| D[Можно снизить коррекцию, увеличить контраст]
C --> E{Добавлять логотип?}
D --> E
E -->|Да| F[Использовать Pillow или SVG; тестировать]
E -->|Нет| G[Обычная генерация qrcode]Короткое объявление для команды (100–200 слов)
Создана инструкция по генерации и распознаванию QR‑кодов на Python. Включены готовые скрипты для генерации, изменения визуала и распознавания статически и в реальном времени через веб‑камеру. Добавлены рекомендации по выбору версии и уровня коррекции, чек‑листы для разработки и QA, а также советы по безопасности и совместимости. Используйте документ как базовый SOP при внедрении QR‑функционала.
Краткое резюме
- Python позволяет быстро создавать и читать QR‑коды.
- qrcode + Pillow/segno — для генерации; OpenCV — для распознавания и сканирования с камеры.
- Тестируйте при реальных условиях (освещение, печать, разные камеры).
- Не храните секреты в QR в открытом виде; следуйте правилам безопасности и конфиденциальности.

Важно: прежде чем публиковать массово, проведите тесты на целевых устройствах и носителях.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента