Подглава 2.5.1 Понимание кода трекера лица
Давайте начнем с заголовочного файла. Заголовочные файлы ROS, которые мы используем в коде, находятся здесь. Мы должны включить ros/ros.h в каждый узел ROS C ++; в противном случае исходный код не будет компилироваться. Остальные три заголовка являются заголовками транспорта изображения, которые имеют функции для публикации и подписки на сообщения изображения с низкой пропускной способностью. Заголовок cv_bridge имеет функции для преобразования между типами данных OpenCV ROS. Заголовок image_encoding.h имеет формат кодирования изображения, используемый во время преобразования ROS-OpenCV:
Следующий набор заголовков для OpenCV. Заголовок imgproc состоит из функций обработки изображений, highgui имеет функции, связанные с GUI, а objdetect.hpp имеет API для обнаружения объектов, такие как классификатор Haar:
Последний заголовочный файл предназначен для доступа к пользовательскому сообщению с именем centroid. Определение сообщения центроида имеет два поля, int32x ,а также Int32 года, Он может держать центр тяжести файла. Вы можете проверить это определение сообщения из папки face_tracker_pkg/msg/centroid.msg:
Следующие строки кода дают имя окну необработанного изображения и окну обнаружения лица:
Следующие строки кода создают класс C ++ для нашего детектора лиц. Фрагмент кода создает дескрипторы NodeHandle, который является обязательным дескриптором для узла ROS; image_transport, который помогает отправлять сообщения ROS Image по графу вычислений ROS; и издатель для лицевого центроида, который может публиковать значения центроидов, используя определенный нами файл centroid.msg. Остальные определения предназначены для обработки значений параметров из файла параметров track.yaml:
Ниже приведен код для извлечения параметров ROS из файла track.yaml. Преимущество использования параметров ROS состоит в том, что мы можем избежать жесткого кодирования этих значений внутри программы и изменять значения без перекомпиляции кода:
Следующий код создает подписчика для topic входного изображения и издателя для изображения с обнаруженным лицом. Всякий раз, когда изображение попадает в topic входного изображения, оно вызывает функцию imageCb. Названия тем извлекаются из параметров ROS. Мы создаем другого издателя для публикации значения центроида, который является последней строкой фрагмента кода:
Следующий фрагмент кода - это определение imageCb, который является обратным вызовом для input_image_topic, что он в основном делает, это конвертирует sensor_msgs/Image данные в cv::Mat Тип данных OpenCV. cv_bridge::CvImagePtr cv_ptr буфер выделяется для хранения образа OpenCV после выполнения преобразования ROS-OpenCV с использованием функции cv_bridge::toCvCopy:
Теперь мы переходим к основной части программы, которая заключается в обнаружении лица, выполненного для преобразованного типа данных изображения OpenCV, из сообщения ROS Image. Ниже приведен вызов функции detectAndDraw(), который выполняет обнаружение лица, и в последней строке вы можете увидеть опубликованную в topic выходного изображения. С помощью
cv_ptr->image
мы можем получить cv::Mat тип данных, и в следующей строке,
cv_ptr->toImageMsg()
может преобразовать это в ROSImage. Аргументы функции
detectAndDraw()
- это изображение OpenCV и каскадные переменные:
detectAndDraw( cv_ptr->image, cascade );
image_pub_.publish(cv_ptr->toImageMsg());
Следующий цикл будет повторяться для каждого лица, обнаруженного с помощью функции detectMultiScale(). Для каждого лица он находит центроид и публикует /face_centroid topic:
Чтобы сделать окно выходного изображения более интерактивным, есть текст и строки для оповещения о лице пользователя слева или справа или в центре. Этот последний раздел кода в основном для этой цели. Для этого используется API OpenCV. Вот код для отображения текста, такого как Левый, Правый и Центр, на экране:
Отлично! Мы закончили с кодом трекера; давайте посмотрим, как его собрать и сделать его исполняемым.
Last updated
Was this helpful?