ROS cv_bridge ImagePtr 在 C++ 字符串中的转换

Posted

技术标签:

【中文标题】ROS cv_bridge ImagePtr 在 C++ 字符串中的转换【英文标题】:ROS cv_bridge ImagePtr conversion in c++ string 【发布时间】:2017-05-29 02:14:59 【问题描述】:

下面的代码 sn-p 来自 ros 订阅者节点,其中基于主题订阅并显示视频图像帧。根据我的要求 cv_ptr->image 需要转换为 c++ 字符串,以便我可以从中创建字节数组(向量)。

void imageCb(const sensor_msgs::ImageConstPtr& msg)

    cv_bridge::CvImagePtr cv_ptr;
    try
    
      cv_ptr = cv_bridge::toCvCopy(msg, enc::BGR8);
    
    catch (cv_bridge::Exception& e)
    
      ROS_ERROR("cv_bridge exception: %s", e.what());
      return;
    

    if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
      cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));

    cv::imshow(WINDOW, cv_ptr->image);
    cv::waitKey(3);

基本上我正在寻找在 c++ 字符串中转换 cv_ptr->image 帧缓冲区的 API。根据主题订阅图像后,我需要将其转换为字节数组,以便它可以作为另一端 activemqjava 插入到 activemqcpp 生产者中订阅者期望字节流格式相同。

string img_string = (copy operation) cv_ptr->image;// Not sure how to copy this buffer in c++ string

vector <unsigned char> vec(img_string.begin().img_string.end());

下面是根据 cv_bridge.h 文件的类规范。

class CvImage;
 typedef boost::shared_ptr<CvImage> CvImagePtr;
 typedef boost::shared_ptr<CvImage const> CvImageConstPtr;

 class CvImage
 
 public:
 std_msgs::Header header; 
 std::string encoding;    
 cv::Mat image;           
 sensor_msgs::ImagePtr toImageMsg() const;

   void toImageMsg(sensor_msgs::Image& ros_image) const;

   typedef boost::shared_ptr<CvImage> Ptr;
   typedef boost::shared_ptr<CvImage const> ConstPtr;

;

谁能建议如何在 roscpp 中实现相同的目标?

【问题讨论】:

【参考方案1】:

这里指定http://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a4d33bed1c850265370d2af0ff02e1564 OpenCV 的 Mat 类已经将图像数据存储为无符号字符数组。

cv_ptr-&gt;image 的类型已经是 cv::Mat

所有你需要做的就是访问它的内容,比如cv_ptr-&gt;image.data

【讨论】:

你的意思是:cv::Mat image = cv_ptr->image; string mystring (image.begin(),image.end ());现在 push_back 向量中的字符串。 它是一个常规数组(但不是字符串,每个 char 数组都不是字符串!!)因此您可以直接访问其元素并从那里初始化向量。正如你所说的 cv::Mat 已经定义了开始和结束迭代器,你可以直接从 cv::Mat 实例初始化一个向量,例如:std::vector&lt;unsigned char&gt; my_vec(cv_ptr-&gt;image.begin(), cv_ptr-&gt;image.end()); 它给出了编译错误,因为 cv_ptr 是一个 boost shared_ptr 并且它没有开始和结束方法,所以除了单独创建字符串并在向量内迭代之外我别无选择。

以上是关于ROS cv_bridge ImagePtr 在 C++ 字符串中的转换的主要内容,如果未能解决你的问题,请参考以下文章

Ros发布图像消息

ROS+opencv实践-cv_bridge的使用

ROS+opencv实践-cv_bridge的使用

CV_Bridge | Image的ROS数据类型与opencv数据类型之间的转换

无法将 cv_bridge 与 ROS Kinetic 和 Python3 一起使用

ROS订阅两个图像节点