Гид по технологиям

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

6 min read Python Обновлено 03 Apr 2026
QR‑коды в Python: создать и распознать
QR‑коды в Python: создать и распознать

QR-код на экране мобильного телефона

QR‑код (Quick Response) — это матричный штрихкод, в котором хранится закодированная информация. Название подчёркивает быстрое считывание и вместимость данных. QR‑коды встречаются повсеместно: на афишах, в журналах, кинотеатрах, на сайтах, в рекламах и на товарах.

С помощью Python вы можете быстро сгенерировать QR‑код, изменить его внешний вид и расшифровать данные из изображения или с веб‑камеры.

Базовая настройка окружения Python

Рекомендуется использовать изолированное виртуальное окружение для каждого проекта. Это облегчает управление зависимостями и повторяемость сборки.

Создание виртуального окружения

Вы можете создать виртуальное окружение разными способами: virtualenv, venv, conda. Пример ниже использует virtualenv.

  1. Создайте папку командой mkdir [Folder].
  2. Перейдите в неё: cd [Folder].
  3. Создайте окружение: virtualenv [Environment Name].
  4. Активируйте окружение: [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-python
pip3 install qrcode
pip3 install numpy
pip3 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).

QR‑код с нестандартным размером ячейки

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)

QR‑код с красной заливкой

Изменение цвета фона

Параметр 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)

QR‑код с синим фоном

Изменение толщины рамки

Параметр 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‑код с увеличенной рамкой

Распознавание 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 разных телефонах/камерах.
  • Тесты при разном освещении и углах наклона.
  • Тесты на частично повреждённых кодах.

Для операций:

  • Резервные ключи и процесс отката при изменении формата хранения.
  • Мониторинг ошибок распознавания.

Мини‑методология разработки: быстрое прототипирование

  1. Сгенерировать базовый QR с минимальным набором данных.
  2. Проверить распознавание в локальной среде (файл и камера).
  3. Добавить кастомизации (цвет, логотип) и повторно протестировать.
  4. Проводить 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 в открытом виде; следуйте правилам безопасности и конфиденциальности.

QR‑код MUO — пример вывода

Важно: прежде чем публиковать массово, проведите тесты на целевых устройствах и носителях.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро