首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】ROS:cv_bridge包使用与图像转换示例

【C++】ROS:cv_bridge包使用与图像转换示例

作者头像
DevFrank
发布于 2024-07-24 07:55:52
发布于 2024-07-24 07:55:52
89800
代码可运行
举报
运行总次数:0
代码可运行

😏1. cv_bridge介绍

cv_bridge是一个用于在ROS(Robot Operating System)和OpenCV之间进行图像转换的库。它提供了方便的接口和功能,用于在ROS中将ROS图像消息(sensor_msgs/Image)与OpenCV图像格式之间进行相互转换。

在ROS中,cv_bridge通常与sensor_msgs包一起使用,用于处理图像消息,并使用OpenCV进行图像处理计算机视觉算法和图像分析等操作。

以下是一些cv_bridge库的主要功能:

1.将ROS图像消息转换为OpenCV图像格式:cv_bridge提供了方便的方法,可以将ROS图像消息转换为OpenCV的cv::Mat格式,方便在OpenCV中进行图像处理。

2.将OpenCV图像转换为ROS图像消息:cv_bridge还提供了将OpenCV的cv::Mat图像转换为ROS图像消息的方法,以便将处理后的图像传递给其他ROS节点或话题。

3.支持不同的图像编码格式:cv_bridge支持各种常见的图像编码格式,包括JPEG、PNG、BMP等。它可以在ROS和OpenCV之间进行透明的编码和解码操作。

4.进行图像数据的共享:cv_bridge允许在ROS和OpenCV之间共享图像数据,而无需进行复制。这在处理大型图像时可以提高性能和效率。

😊2. 环境安装与配置

正常情况下,安装完ros后可正常使用cv_bridge包。

cv_bridge一般要与OpenCV版本对应,比如noetic对应OpenCV4melodic对应OpenCV3,如果在melodic环境下装了OpenCV4,可能会报错,可参考这篇来解决这个问题:http://t.csdnimg.cn/Sbwji

😆3. 图像转换应用示例

下面基于cv_bridge包实现opencv读取视频并通过ros消息发布,然后订阅节点获取到图像后通过opencv进行显示。

image_pub节点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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); // 发布频率为30Hz
    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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
<?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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
# 运行节点
catkin_make # 编译
source devel/setup.bash
rosrun image_pub image_pub # 发布
rosrun image_sub image_sub # 订阅

这样就实现了ros图像与OpenCV图像之间的转换,以及使用opencv的VideoCapture类实现视频的读取与显示。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ROS教程(五):OpenCV调用USB摄像头并发布topic(详细图文)
创建功能包教程在ROS教程(三):创建程序包及节点(图文)已讲解,本文便不再细讲。
全栈程序员站长
2022/09/06
2.6K0
ROS教程(五):OpenCV调用USB摄像头并发布topic(详细图文)
ROS入门篇
ROS是一个松耦合的分布式软件框架。上图中有很多的Node(节点),每个节点是在机器人系统中完成一个具体功能的进程,比方说有的Node是完成图像识别,有的Node是完成一个图像的驱动,它们之间会有一系列图像的传输。节点与节点之间位置也不是固定的,比如上图中有两台电脑,一个A,一个B,有些节点可以在A当中,有些节点可以在B当中,它们之间可以通过一系列的传输方式来完成通讯。每个节点的编程语言也不是固定的,可以使用Python,也可以使用C++。
算法之名
2023/10/16
2.4K0
ROS入门篇
【ROS】pcl_ros使用与点云转换示例
pcl_ros是一个用于将PCL(点云库)与ROS(机器人操作系统)集成的软件包。它提供了用于在ROS环境中处理和可视化点云数据的工具和功能。
DevFrank
2024/07/24
8100
2.ROS基础-ROS通信编程
程序逻辑: 1.头文件 2.ROS节点初始化,前两个参数和main()函数参数一致,最后一个参数定义节点名称。 3.创建节点句柄 比较方便的去管理节点的资源,比如发布者、订阅者、一些话题之类的 4.创建发布者,代码中1000为队列长度 5.设置循环频率,例如10hz,循环100ms 6.开始循环
小飞侠xp
2019/03/15
1.6K0
2.ROS基础-ROS通信编程
ROS中的TF坐标变换:从传感器数据到机器人系统的精准定位
在机器人系统中,配备了多种传感器,例如激光雷达和摄像头等。这些传感器能够感知机器人周围的物体位置,包括坐标、横向、纵向以及高度的距离信息。它们的作用是协助机器人准确定位障碍物。然而,并非所有传感器都能直接提供物体相对于机器人系统或其他组件的方位信息。虽然可以获取物体相对特定传感器的方位信息,但这并不等同于物体相对于整个机器人系统或其他组件的方位信息。在信息显示方面存在限制,因为这需要经历一定的转换过程。更详细地描述如下:
芯动大师
2025/05/19
2820
ROS中的TF坐标变换:从传感器数据到机器人系统的精准定位
【机器人】ROS1工程案例:自定义消息类型
作者:杨丝儿 座右铭:始于兴趣,源于热爱,成于投入。 介绍:爱丁堡大学 人工智能专业。技术兴趣点集中在机器人、人工智能可解释性、数学、物理等等。 个人博客:discover304.top
杨丝儿
2022/03/01
4210
【机器人】ROS1工程案例:自定义消息类型
ROS 编程入门的介绍
ROS(Robot Operating System)是一种开源的机器人软件框架,广泛用于机器人开发中。通过使用 ROS,开发者可以轻松创建和管理机器人应用程序。在本节中,我们将介绍如何创建一个 ROS 功能包并实现一些基本功能。
芯动大师
2024/09/18
3040
ROS 编程入门的介绍
ROS联合webots实战案例(三)在webots中使用ROS控制小机器人[1]
本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
锡城筱凯
2021/02/07
1.5K0
ROS联合webots实战案例(三)在webots中使用ROS控制小机器人[1]
ROS编程(ETH)2018更新版习题说明(二)
- ROS包结构 - 使用Eclipse进行集成化编程 - ROS C++客户端库(roscpp) - ROS订阅者和发布者 - ROS参数服务器
zhangrelay
2019/01/23
6860
ROS机器人操作系统最佳实践指南
----ROS Best Practices:https://github.com/ethz-asl/ros_best_practices/wiki----
zhangrelay
2022/04/29
1K0
ROS机器人操作系统最佳实践指南
ROS通信架构(下)
队长与爱人相互七十年不能共舞,蚁人与女儿分隔五年未能相见,钢铁侠邂逅父亲期盼新生,雷神遇见母亲不忍分别。时间会给爱情设置衰老的考验,给生命带来变化的乐趣,会让未尽千言凝成一个拥抱,让遗憾万般聚成一场话别。天神拥有肉身,超能沦为凡胎,你是一千四百万分之一的胜利,是三千遍仍未尽的爱。——《复仇者联盟4》
小飞侠xp
2019/05/14
1.2K0
ROS通信架构(下)
ROS机器视觉入门:从基础到人脸识别与目标检测
从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。
芯动大师
2025/05/15
1840
ROS机器视觉入门:从基础到人脸识别与目标检测
Tello和ROS的一些资料
之前,一些博文给出了Cozmo和Vector等地面小型机器人的资料,这篇博文,针对空中机器人---Tello。
zhangrelay
2019/01/31
2.6K0
Tello和ROS的一些资料
【机器人】ROS1工程案例:服务和动作
碎碎念:Hello米娜桑,这里是英国留学中的杨丝儿。我的博客技术点集中在机器人、人工智能可解释性、数学、物理等等,感兴趣地点个关注吧,持续高质量输出中。
杨丝儿
2022/02/28
3030
【机器人】ROS1工程案例:服务和动作
ROS中cv_bridge如何用python3进行编译
最近遇到了个问题,cv_bridge实现了opencv和ros中图像数据类型的转换,但ros-melodic默认python版本是python2。在配置yolact环境的时候,要求是python3。 这就导致在ros自带的cv_bridge是python2版本,想使用python3的话需要自己去编译cv_bridge。否则会报错:
全栈程序员站长
2022/09/01
2.1K0
ROS Beginner(长文预警!
参考网站:http://wiki.ros.org/cn/ROS/Tutorials
From Zero
2021/12/07
1K0
ROS联合webots实战案例(五)导航功能包入门1
在前面几章中分别介绍了在webots中如何创建自己的机器人、添加传感器以及使用手柄或键盘驱动它在仿真环境中移动。在本章中,你会学习到ROS系统最强大的特性之一,它能够让你的机器人自主导航和运动。
锡城筱凯
2021/02/07
1.6K0
ROS联合webots实战案例(五)导航功能包入门1
ROS(indigo)RRT路径规划
源码地址:https://github.com/nalin1096/path_planning
zhangrelay
2019/01/23
1.9K0
如何在ROS中使用PCL—数据格式(1)
关于PCL在ros的数据的结构,具体的介绍可查 看 wiki.ros.org/pcl/Overview
点云PCL博主
2019/07/31
3.3K0
如何在ROS中使用PCL—数据格式(1)
ROS2之OpenCV怎么理解一段代码
ROS2之OpenCV基础代码对比foxy~galactic~humble_zhangrelay的博客-CSDN博客
zhangrelay
2022/06/17
9490
ROS2之OpenCV怎么理解一段代码
相关推荐
ROS教程(五):OpenCV调用USB摄像头并发布topic(详细图文)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档