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 без копирования. Это повышает производительность и эффективность при обработке больших изображений.
В обычных обстоятельствах,Установка завершенаrosМожно использовать обычно послеcv_bridge
Сумка。
cv_bridge
Обычно требуетсяиOpenCVСоответствие версий,напримерnoetic
переписыватьсяOpenCV4
,melodic
переписыватьсяOpenCV3
,Если OpenCV4 установлен в мелодической среде,Может быть сообщено об ошибке,Вы можете обратиться к этой статье, чтобы решить эту проблему:http://t.csdnimg.cn/Sbwji
Следующее основано на пакете cv_bridge для реализации opencv для чтения видео и публикации его через сообщения ros, а затем подписки на узел для получения изображения и его отображения через opencv.
// 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
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
<?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.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 по сути аналогичны узлу выпуска, за исключением разных имен файлов кода.
# Запуск узла
catkin_make # компилировать
source devel/setup.bash
rosrun image_pub image_pub # выпускать
rosrun image_sub image_sub # подписка
Это обеспечивает преобразование изображений ros и изображений OpenCV и использует класс VideoCapture opencv для чтения и отображения видео.