当前位置:   article > 正文

ROS 中CompressedImage消息的发布与订阅_ros compassedimage

ros compassedimage

背景:某些情况下需要录图像数据的包,非常占空间和带宽,尤其对于一些工业相机图像一张好几兆,每秒30帧的话一份钟好几个G,这时候可以选择的订阅压缩图像,下面直接来个demo。

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

  1. #include "ros/ros.h"
  2. #include "sensor_msgs/Image.h"
  3. #include "sensor_msgs/CompressedImage.h"
  4. #include "sensor_msgs/image_encodings.h"
  5. #include <image_transport/image_transport.h>
  6. #include <cv_bridge/cv_bridge.h>
  7. #include <opencv2/opencv.hpp>
  8. #include <iostream>
  9. using namespace std;
  10. cv::Mat imgCallback;
  11. image_transport::Publisher image_pub;
  12. static void ImageCallback(const sensor_msgs::ImageConstPtr &msg)
  13. {
  14. try
  15. {
  16. cout<<"FLIR time:"<<msg->header.stamp<<endl;
  17. return;
  18. image_pub.publish(msg);
  19. cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
  20. imgCallback = cv_ptr->image;
  21. cv::imshow("imgCallback",imgCallback);
  22. cv::waitKey(1);
  23. cout<<"cv_ptr: "<<cv_ptr->image.cols<<" h: "<<cv_ptr->image.rows<<endl;
  24. //std::cout<<"Image: "<<msg->width<<" x "<<msg->height<<std::endl;
  25. }
  26. catch (cv_bridge::Exception& e)
  27. {
  28. //ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  29. //ROS_ERROR("Could not convert from '%s' to 'bgr8'.",msg->format.c_str());
  30. }
  31. //原文链接:https://blog.csdn.net/qq_30460905/article/details/80489841
  32. }
  33. int main(int argc, char **argv)
  34. {
  35. ros::init(argc, argv, "CompressedImage");
  36. ros::NodeHandle nh;
  37. image_transport::ImageTransport it(nh);
  38. image_transport::Subscriber image_sub;
  39. std::string image_topic = "usb_cam/image_raw";
  40. image_sub = it.subscribe(image_topic,10,ImageCallback);
  41. image_pub = it.advertise("image_compressed",1);
  42. ros::spin();
  43. return 0;
  44. }

订阅压缩图像话题消息很简单,直接用ros::Publisher订阅即可

  1. #include "ros/ros.h"
  2. #include "sensor_msgs/CompressedImage.h"
  3. #include "sensor_msgs/image_encodings.h"
  4. #include <cv_bridge/cv_bridge.h>
  5. #include <opencv2/opencv.hpp>
  6. #include <iostream>
  7. using namespace std;
  8. cv::Mat imgCallback;
  9. static void ImageCallback(const sensor_msgs::CompressedImageConstPtr &msg)
  10. {
  11. try
  12. {
  13. cv_bridge::CvImagePtr cv_ptr_compressed = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
  14. imgCallback = cv_ptr_compressed->image;
  15. cv::imshow("imgCallback",imgCallback);
  16. cv::waitKey(1);
  17. cout<<"cv_ptr_compressed: "<<cv_ptr_compressed->image.cols<<" h: "<<cv_ptr_compressed->image.rows<<endl;
  18. }
  19. catch (cv_bridge::Exception& e)
  20. {
  21. //ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  22. }
  23. }
  24. int main(int argc, char **argv)
  25. {
  26. ros::init(argc, argv, "CompressedImage");
  27. ros::NodeHandle nh;
  28. ros::Subscriber image_sub;
  29. std::string image_topic = "image_compressed/compressed";
  30. image_sub = nh.subscribe(image_topic,10,ImageCallback);
  31. ros::Rate loop_rate(10);
  32. while (ros::ok())
  33. {
  34. ROS_INFO("ROS OK!");
  35. ros::spinOnce();
  36. loop_rate.sleep();
  37. }
  38. return 0;
  39. }

CMakeLists.txt

  1. cmake_minimum_required(VERSION 2.8.3)
  2. project(compress_Image)
  3. ## Compile as C++11, supported in ROS Kinetic and newer
  4. # add_compile_options(-std=c++11)
  5. find_package(catkin REQUIRED COMPONENTS
  6. roscpp sensor_msgs cv_bridge image_transport
  7. )
  8. find_package(OpenCV 3.3 REQUIRED)
  9. include_directories(${OpenCV_INCLUDE_DIRS})
  10. link_directories(${OpenCV_LIBRARY_DIRS})
  11. catkin_package()
  12. include_directories(
  13. # include
  14. ${catkin_INCLUDE_DIRS}
  15. )
  16. add_executable(${PROJECT_NAME}_sub src/compress_sub.cpp)
  17. ## Specify libraries to link a library or executable target against
  18. target_link_libraries(${PROJECT_NAME}_sub
  19. ${catkin_LIBRARIES}
  20. ${OpenCV_LIBRARIES}
  21. )

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/845623
推荐阅读
相关标签
  

闽ICP备14008679号