「ROS OpenCV」 接收压缩图像话题并显示

image transport

ros话题机制默认通过TCP进行传输,因此特别容易堵塞,raw原始图像比compressed压缩图像传输速度慢。

不进行任何的说明或者是赋值,那么最后的结果 跟没使用这个模块是一样的效果, ROS最终会follow的topic依然是未压缩的图像;

如果参数设置成compressed的类型,每副图像都会以JPEG或者PNG的形式进行压缩,而后在callback之前,也就是接收到数据之后进行解压缩decompression;

如果参数设置成theora,视频流将会被压缩成为更小的格式,这种方式比compressed更高效一点,因为它会推算连续帧中的相似性。

rqt_reconfigure可以设置压缩比
「ROS OpenCV」 接收压缩图像话题并显示_第1张图片

ROS中的图像数据类型

raw(sensor_mags/Image)
compressed (sensor_msgs/CompressedImage)

使用rviz和image_view查看上面两种图像数据

rosrun image_view image_view image:=/image

「ROS OpenCV」 接收压缩图像话题并显示_第2张图片
「ROS OpenCV」 接收压缩图像话题并显示_第3张图片

rosrun image_view image_view image:=/image compressed

「ROS OpenCV」 接收压缩图像话题并显示_第4张图片
「ROS OpenCV」 接收压缩图像话题并显示_第5张图片

压缩图像的发布

先订阅一个sensor::Image消息,然后使用image_transport发布图像,会同时产生一个压缩和不压缩的图像话题

压缩图像的接收

创建工作空间和功能包、功能包依赖文件参考前面教程

gedit ~/catkin_ws/src/pub_sub_image_topic_pkg/src/sub_compress_image_topic.cpp
#include "ros/ros.h"
#include "sensor_msgs/CompressedImage.h"
#include "sensor_msgs/image_encodings.h"
#include 
#include 
#include 
using namespace std;
cv::Mat imgCallback;
static void ImageCallback(const sensor_msgs::CompressedImageConstPtr &msg)
{
    try
    {
      cv_bridge::CvImagePtr cv_ptr_compressed = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
      imgCallback = cv_ptr_compressed->image;
      cv::imshow("imgCallback",imgCallback);
      cv::waitKey(1);
      cout<<"cv_ptr_compressed: "<<cv_ptr_compressed->image.cols<<" h: "<<cv_ptr_compressed->image.rows<<endl;
    }
    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, "CompressedImage");
  ros::NodeHandle nh;
  ros::Subscriber image_sub;
  std::string image_topic = "/image/compressed";
  image_sub = nh.subscribe(image_topic,10,ImageCallback);
 
  ros::Rate loop_rate(10);
  while (ros::ok())
  {
    ROS_INFO("ROS OK!");
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

编译文件CMakeLists.txt

在前面文章的基础上增加下面内容

add_executable(sub_compress_image_topic src/sub_compress_image_topic.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(sub_compress_image_topic ${OpenCV_LIBS} ${catkin_LIBRARIES})

运行效果

roscore
catkin_ws$ source devel/setup.bash 
rosrun pub_sub_image_topic_pkg pub_image_topic
catkin_ws$ source devel/setup.bash 
rosrun pub_sub_image_topic_pkg sub_compress_image_topic

「ROS OpenCV」 接收压缩图像话题并显示_第6张图片

你可能感兴趣的:(从零开始学习SLAM,image_transport)