Сканирование QR-кодов в режиме реального времени с Raspberry Pi
С помощью веб-камеры и Raspberry Pi 4 будем извлекать данные из QR-кодов, написав для этого собственный скрипт на Python.
Комплектующие
Для генерации и распознавания QR-кодов потребуются следующие комплектующие и софт.
Raspberry Pi 4 Model B × 1
Raspberry Pi Camera Module V2 × 1
Microsoft VS Code
Python 3.6
Как работают QR-коды
Quick Response Code, или код быстрого отклика, схож со штрих-кодами тем, что может хранить информацию в виде чёрных и белых квадратов. Однако вместо лазерного луча считывание происходит камерой, которая распознаёт промежутки и передаёт полученную информацию для дальнейшей обработки.
QR-код включает в себя несколько крупных квадратных элементов, которые служат для выравнивания и определения границ, задают формат столбцов, указывают номер версии и, разумеется, содержат сами закодированные данные.
Хранящаяся в них информация может иметь различные типы — числа, текстовые символы, двоичные данные, — что открывает широкие возможности для практического применения.
Часто рекламодатели размещают в QR-кодах URL-адреса, ведущие на свои сайты. Другие организации могут зашифровать в коде важные сведения о продукте, к примеру серийный номер, и прикрепить его к соответствующему компоненту.
Генерируем с помощью Python
Для Python существует пакет qrcode, который позволяет оперативно кодировать информацию в QR-код и экспортировать результат как изображение. Установка выполняется командой:
pip3 install qrcode[pil]
Далее импортируем его в скрипт и формируем PIL-изображение следующим образом:
import qrcode
code = qrcode.make('Hello world!')
Полученное изображение можно сохранить в файл так:
code.save(<filename>.png)
Дополнительную настройку кодов можно выполнить через класс QRCode, предлагающий такие параметры, как размер, уровень коррекции ошибок, версия и толщина рамки.
После того как все нужные QR-коды сгенерированы, разместите их на одном листе и распечатайте.
Настройка Raspberry Pi 4
Выбор пал на Raspberry Pi 4 благодаря его вычислительным возможностям, которые способны несколько ускорить обработку изображений в приложении.
На плату была установлена Raspbian: образ ОС скачан и записан при помощи Balena Etcher. Далее подключение по SSH и установка OpenCV:
sudo apt-get update
sudo apt-get install python3-opencv
sudo apt-get install libqt4-test python3-sip python3-pyqt5 libqtgui4 libjasper-dev libatlas-base-dev -y
pip3 install opencv-contrib-python==4.1.0.25
sudo modprobe bcm2835-v4l2
Последняя команда открывает возможность работать с Picamera через OpenCV VideoCapture.
Проверка корректности установки:
python3
import cv2
Чтение QR-кодов
Алгоритм работы программы таков:
Инициализировать камеру и настроить детектор QR-кодов.
Получить очередной кадр и извлечь из него QR-код.
При обнаружении кода — обвести его рамкой и вывести содержащиеся данные над ним.
Если клавиша выхода q не нажата, перейти обратно к шагу 2.
Помимо этого, программа при каждом обновлении отображает текущий кадр с наложенной графикой.
import cv2
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
while True:
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
if(bbox is not None):
for i in range(len(bbox)):
cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
0, 255), thickness=2)
cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 0), 2)
if data:
print("data found: ", data)
cv2.imshow("code detector", img)
if(cv2.waitKey(1) == ord("q")):
break
cap.release()
cv2.destroyAllWindows()
Поскольку QR-коды чрезвычайно удобны для учёта разнообразных компонентов — например, на складе — в дальнейшем планируется задействовать их для инвентаризации собственного оборудования: коробок с резисторами или плат Arduino.