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->image
的类型已经是 cv::Mat
。
所有你需要做的就是访问它的内容,比如cv_ptr->image.data
【讨论】:
你的意思是:cv::Mat image = cv_ptr->image; string mystring (image.beginstd::vector<unsigned char> my_vec(cv_ptr->image.begin(), cv_ptr->image.end());
它给出了编译错误,因为 cv_ptr 是一个 boost shared_ptr 并且它没有开始和结束方法,所以除了单独创建字符串并在向量内迭代之外我别无选择。以上是关于ROS cv_bridge ImagePtr 在 C++ 字符串中的转换的主要内容,如果未能解决你的问题,请参考以下文章
CV_Bridge | Image的ROS数据类型与opencv数据类型之间的转换