[C++] ROS: примеры использования пакета cv_bridge и преобразования изображений
[C++] ROS: примеры использования пакета cv_bridge и преобразования изображений

😏1. Знакомство с cv_bridge.

cv_bridgeэто использование ВсуществоватьROS(Robot Operating System)иOpenCVБиблиотека для преобразования изображений между。Обеспечивает удобный интерфейси Функция,использовать ВВ РОСВоляROSграфическое сообщение(sensor_msgs/Image)иOpenCVПреобразование между форматами изображений。

В РОС,cv_bridgeв целомиsensor_msgsпакет используется вместе,для обработки графических сообщений,И используйте OpenCV для обработки изображений, алгоритмов компьютерного зрения и анализа изображений.

Вот некоторые основные возможности библиотеки cv_bridge:

1. Преобразование сообщений изображения ROS в формат изображения OpenCV: cv_bridge предоставляет удобный метод преобразования сообщений изображения ROS в формат OpenCV cv::Mat для облегчения обработки изображений в OpenCV.

2. Преобразование изображений OpenCV в сообщения изображений ROS: cv_bridge также предоставляет методы для преобразования изображений cv::Mat OpenCV в сообщения изображений ROS, чтобы передавать обработанные изображения другим узлам или темам ROS.

3. Поддержка различных форматов кодирования изображений: cv_bridge поддерживает различные распространенные форматы кодирования изображений, включая JPEG, PNG, BMP и т. д. Он обеспечивает прозрачные операции кодирования и декодирования между ROS и OpenCV.

4. Совместное использование данных изображения: cv_bridge позволяет совместно использовать данные изображения между ROS и OpenCV без копирования. Это повышает производительность и эффективность при обработке больших изображений.

😊2. Установка и настройка среды.

В обычных обстоятельствах,Установка завершенаrosМожно использовать обычно послеcv_bridgeСумка。

cv_bridgeОбычно требуетсяиOpenCVСоответствие версий,напримерnoeticпереписыватьсяOpenCV4,melodicпереписыватьсяOpenCV3,Если OpenCV4 установлен в мелодической среде,Может быть сообщено об ошибке,Вы можете обратиться к этой статье, чтобы решить эту проблему:http://t.csdnimg.cn/Sbwji

😆3. Пример приложения для преобразования изображений.

Следующее основано на пакете cv_bridge для реализации opencv для чтения видео и публикации его через сообщения ros, а затем подписки на узел для получения изображения и его отображения через opencv.

узел image_pub
Язык кода:javascript
копировать
// image_pub.cpp
#include <ros/ros.h>
#include <opencv2/opencv.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "image_pub");
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);
    image_transport::Publisher image_pub = it.advertise("camera/image", 1);

    // Открыть видеофайл
    cv::VideoCapture cap("../test.mp4");
    if (!cap.isOpened())
    {
        ROS_ERROR("Failed to open video file");
        return -1;
    }

    // Определить графическое сообщение
    sensor_msgs::ImagePtr msg;

    ros::Rate loop_rate(30); // Частота выпуска 30 Гц.
    while (ros::ok())
    {
        cv::Mat frame;
        cap >> frame; // Читать кадр видео

        if (frame.empty())
        {
            ROS_INFO("Video ended");
            break;
        }

        // Преобразование формата изображения в сообщение ROS
        msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();

        // Опубликовать сообщение с изображением
        image_pub.publish(msg);
        std::cout << "Published image" << std::endl;

        ros::spinOnce();
        loop_rate.sleep();
    }

    return 0;
}

CMakeLists.txt

Язык кода:javascript
копировать
cmake_minimum_required(VERSION 3.0.2)
project(image_pub)

## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS 
  roscpp 
  rospy
  std_msgs
  sensor_msgs
  image_transport
  cv_bridge
)

catkin_package(
  CATKIN_DEPENDS 
  roscpp 
  rospy 
  std_msgs 
  sensor_msgs 
  image_transport 
  cv_bridge
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME} src/image_pub.cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}
  ${catkin_LIBRARIES}
)

package.xml

Язык кода:javascript
копировать
<?xml version="1.0"?>
<package format="2">
  <name>image_pub</name>
  <version>0.0.0</version>
  <description>The image_pub package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="xxx@todo.todo">xxx</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>sensor_msgs</build_depend>
  <build_depend>image_transport</build_depend>
  <build_depend>cv_bridge</build_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>sensor_msgs</exec_depend>
  <exec_depend>image_transport</exec_depend>
  <exec_depend>cv_bridge</exec_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>
узел image_sub
Язык кода:javascript
копировать
// image_sub.cpp
#include <ros/ros.h>
#include <opencv2/opencv.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>

void imageCallback(const sensor_msgs::ImageConstPtr &msg)
{
    try
    {
        // Преобразование сообщения изображения ROS в изображение OpenCV
        cv::Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;

        // отображать изображение
        cv::imshow("Image", image);
        cv::waitKey(1);
    }
    catch (cv_bridge::Exception &e)
    {
        ROS_ERROR("Failed to convert ROS image to OpenCV image: %s", e.what());
    }
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "image_sub");
    ros::NodeHandle nh;

    // Создание объектов передачи изображений и подписчиков
    image_transport::ImageTransport it(nh);
    image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);

    // Создать локальный дисплей окна opencv
    cv::namedWindow("Image", cv::WINDOW_AUTOSIZE);
    
    ros::spin();

    cv::destroyAllWindows();

    return 0;
}

CMakeLists.txt и package.xml по сути аналогичны узлу выпуска, за исключением разных имен файлов кода.

Язык кода:javascript
копировать
# Запуск узла
catkin_make # компилировать
source devel/setup.bash
rosrun image_pub image_pub # выпускать
rosrun image_sub image_sub # подписка

Это обеспечивает преобразование изображений ros и изображений OpenCV и использует класс VideoCapture opencv для чтения и отображения видео.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.