Мы будем расширять код, который мы создали в первой части этой серии. Если вы еще не пробовали это, обязательно вернитесь, попробуйте и вернитесь сюда!
Ссылка на часть — 1 из этой серии
Ссылка на репозиторий GitHub
Он содержит все сценарии, модели и файлы привязки, которые используются в этой серии руководств.
dhanuzch/pkg_cv_ros_tutorial_by_dhanuzch
Это репозиторий, состоящий из пакета ROS, используемого в серии руководств «Использование OpenCV с Gazebo в ROS от @dhanuzch…github.com »
Запускаем мир беседок
Перед запуском следующей команды убедитесь, что вы запустили git pull
и получили файл setup.bash
, который находится в папке {your_workspace_name}/devel/
.
Затем, чтобы запустить мир беседки, запустите эту команду в терминале.
$ roslaunch pkg_cv_ros_tutorial_by_dhanuzch 2_world.launch
Это должно запустить мир беседки со стеной с QR-кодом и камерой. Это должно выглядеть примерно так…
Если вы видите это, поздравляю! На данный момент вы все правильно установили.
В качестве альтернативы, если вы хотите запустить мир беседки и запустить скрипт из коробки. Затем запустите
$ roslaunch pkg_cv_ros_tutorial_by_dhanuzch 2_world_and_script.launch
Если вы хотите узнать, как работает код, продолжайте читать…
Предварительная обработка изображения
Прежде чем перейти к коду, вы должны знать о такой вещи, как предварительная обработка изображений. Это то, что мы должны сделать, чтобы получить значимые данные из необработанного вывода камеры. Вот статья о предварительной обработке изображений, которую лично я нашел полезной. В этом уроке мы будем использовать некоторые очень простые методы предварительной обработки. Ниже я обсудил один из многих способов предварительной обработки изображений для декодирования QR-кодов.
- Преобразуйте изображение в изображение в градациях серого с помощью функции
COLOR_BGR2GRAY
, доступной в cv2. - Поскольку QR-коды обычно состоят из двух цветов, мы можем использовать пороговую функцию. С помощью этой функции мы можем преобразовать изображение в градациях серого, которое мы получили выше, в бинарное изображение, которое имеет только два цвета, черный и белый.
Обратите внимание, насколько четким стало изображение после предварительной обработки. Теперь перейдем к коду
Код — объяснение.
Поскольку мы строим код, который мы обсуждали в Часть — 1, я сосредоточусь только на тех изменениях, которые были сделаны.
Этот код также доступен как часть пакета в моем репозитории GitHub.
библиотека pyzbar
Эта библиотека используется для декодирования QR-кодов и штрих-кодов. Чтобы узнать больше об этой библиотеке, взгляните на эту статью.
line 8
импортирует функцию декодирования, доступную в библиотеке pyzbar.
Предварительная обработка изображения
line 29
заключается в преобразовании resized_image
в изображение в градациях серого.
line 30
— установить пороговое значение. Обратите внимание, что пороговое значение зависит от множества факторов. И я установил его на 40. Чтобы узнать об этом подробнее, загляните в официальное руководство.
line 31
преобразует изображение в градациях серого в бинарное изображение. Здесь thresh,255
означает, что все значения пикселей выше 40 будут установлены на 255 (белый).
Поскольку в этом уроке условия освещения и QR-код стабильны, мы используем этот подход. Но в реальной жизни использование адаптивного порогового значения или других методов может быть лучшим выбором.
Расшифровка
line 36
самый простой 😛. Все, что вам нужно сделать, это вызвать функцию декодирования с изображением в качестве аргумента, а об остальном позаботится библиотека pyzbar. Это вернет декодированные результаты.
line 38
распечатывает декодированные результаты.
Результат декодирования выглядит следующим образом…
[Decoded(data="You're breathtaking!", type='QRCODE', rect=Rect(left=100, top=278, width=216, height=214), polygon=[Point(x=100, y=278), Point(x=100, y=490), Point(x=316, y=492), Point(x=315, y=278)])]
Не содержит ли наш вывод слишком много информации?
Для печати только декодированных данных. Давайте вставим следующие строки в наш скрипт.
qr_data = qr_result[0].data print qr_data
Хорошо, это дает нам желаемый результат. То есть… «От тебя захватывает дух» :) Не веришь? Вот результат хD
Не неудобно ли получить желаемый результат в терминале?
Итак, далее мы попробуем распечатать данные в окне вывода камеры.
Рисование и написание значимых вещей в окне резюме
Далее наша цель — нарисовать рамку над обнаруженным QR-кодом и напечатать сообщение поверх коробки.
line 43
получает позицию QR-кода в окне от qr_result
Используя функцию прямоугольника, доступную в cv2, и данные, полученные из строки 43, line 45
рисует прямоугольник вокруг QR-кода красного цвета (0, 0, 255)
и толщины 4.
line 47
определяет формат для печати данных QR-кода
line 48
печатает данные QR-кода на 10 пикселей выше поля. Это определяется с помощью (x, y-10)
, тип шрифта Hershey simplex. Цвет красный (0, 0, 255)
и толщина 2. Все эти детали будут напечатаны в окне, которое отображает resized_image
Теперь попробуйте это с другими QR-кодами. И посмотреть, работает ли код…
Дайте мне знать в комментариях, если у вас есть какие-либо сомнения или трудности. А также не забудьте прокомментировать, о чем должен быть мой следующий урок!
Это все для этой серии, ребята!
Пока!