ROS利用节点发布并订阅图片

写在前面:近期打算做一下视觉算法部署,需用到ROS知识传输视频,以此作为记录
首先需要电脑有ROS和opencv

一、图片发布

1、建立新的工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
# 初始化文件
catkin_init_workspace
#    编译工作空间
cd ~/catkin_ws/
catkin_make
#    设置环境变量,避免每次开终端都要source
 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
 source ~/.bashrc

2、创建新的功能包

#   创建my_image_transport功能包
cd catkin_ws/
cd src/
catkin_create_pkg my_image_transport image_transport cv_bridge
#    重新编译
cd ..
catkin_make

3、发布图片

首先进入my_image_transport功能包,创建src文件夹新建my_publisher.cpp文件,并将下述内容复制进去即可

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>


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

  cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
  sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();

  ros::Rate loop_rate(5);
  while (nh.ok()) {
    pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
  }
}

即可在camera/image话题上发布图像

二、图片订阅

同样在src文件夹新建my_subscriber.cpp文件,将下述内容复制进去即可

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
 
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
  try
  {
    cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
  }
  catch (cv_bridge::Exception& e)
  {
    ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  }
}
 
int main(int argc, char **argv)
{
  ros::init(argc, argv, "image_listener");
  ros::NodeHandle nh;
  cv::namedWindow("view");
  cv::startWindowThread();
  image_transport::ImageTransport it(nh);
  image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
  ros::spin();
  cv::destroyWindow("view");
}

即可

三、配置相关文件

1、在CMakeList.txt添加如下代码

find_package(OpenCV)
include_directories(include ${OpenCV_INCLUDE_DIRS})
message(${OpenCV_INCLUDE_DIRS})
#build my_publisher and my_subscriber
# 注意一定要将${OpenCV_LIBS},即opencv加入链接
add_executable(my_publisher src/my_publisher.cpp)
target_link_libraries(my_publisher ${catkin_LIBRARIES} ${OpenCV_LIBS})
 
add_executable(my_subscriber src/my_subscriber.cpp)
target_link_libraries(my_subscriber ${catkin_LIBRARIES} ${OpenCV_LIBS})

2、在package.xml添加如下代码

 
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>cv_bridge</build_depend>
  <build_depend>image_transport</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>cv_bridge</build_export_depend>
  <build_export_depend>image_transport</build_export_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>cv_bridge</exec_depend>
  <exec_depend>image_transport</exec_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

3、重新编译

cd ~/catkin_ws
catkin_make -DCATKIN_WHITHELIST_PACKAGES="my_image_transport"

出现下图即编译完成
在这里插入图片描述
打开roscore,运行rosrun my_image_transport my_publisher path/Picturespath/Pictures为图片路径,在另一个终端运行rosrun my_image_transport my_subscriber即可。

  • 10
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ROS中,可以通过使用`image_transport`和`cv_bridge`库将摄像头节点发布图像数据转化为图像输出。具体步骤如下: 1. 首先,在ROS中启动摄像头节点,让其发布图像数据。 2. 在需要接收图像数据的节点中,通过`image_transport`库创建一个图像订阅者对象,用于接收图像消息。例如,可以使用以下代码创建一个图像订阅者对象: ```python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge def callback(image_msg): # 将图像消息转化为OpenCV图像格式 cv_image = CvBridge().imgmsg_to_cv2(image_msg, "bgr8") # 在这里对图像进行处理或显示 # ... rospy.init_node('image_subscriber') image_sub = rospy.Subscriber('camera/image', Image, callback) ``` 在这个例子中,我们创建了一个名为`image_sub`的图像订阅者对象,订阅了名为`camera/image`的话题,并指定回调函数`callback`用于处理接收到的图像消息。 3. 在回调函数`callback`中,利用`cv_bridge`库将ROS图像消息转化为OpenCV图像格式,然后进行图像处理或显示。例如,可以使用以下代码将图像消息转化为OpenCV图像格式: ```python # 将图像消息转化为OpenCV图像格式 cv_image = CvBridge().imgmsg_to_cv2(image_msg, "bgr8") ``` 在这个例子中,我们使用`CvBridge()`类的`imgmsg_to_cv2()`方法将ROS图像消息`image_msg`转化为OpenCV图像格式,并将其存储在`cv_image`变量中。 4. 最后,可以使用OpenCV库将图像显示出来,或者将其保存到文件中。例如,可以使用以下代码将图像显示出来: ```python # 显示图像 cv2.imshow("Image", cv_image) cv2.waitKey(1) ``` 在这个例子中,我们使用OpenCV库的`imshow()`函数将图像显示在名为`Image`的窗口中,并使用`waitKey()`函数等待用户按下键盘上的任意键。注意,需要在代码中添加`cv2.waitKey(1)`语句以保证图像窗口能够正常显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值