ros cv_bridge 话题转 mat 的 cpp 例子
时间: 2024-10-16 19:17:01 浏览: 30
ROS(Robot Operating System)中的`cv_bridge`是一个方便工具,用于在ROS节点之间转换图像数据,特别是将ROS的标准`sensor_msgs/Image`消息转换成OpenCV的`Mat`结构。下面是一个简单的C++示例,展示了如何使用`cv_bridge`从一个`image`话题获取并转换成`Mat`:
```cpp
#include <ros/ros.h>
#include <sensor_msgs/imagemsg_to_cv2.h>
#include <opencv2/opencv.hpp>
class ImageConverter {
public:
void imageCallback(const sensor_msgs::ImageConstPtr& msg) {
cv_bridge:: CvBridge bridge;
// 将ROS图像消息转换为OpenCV Mat
cv::Mat img;
try {
bridge.imgMsgToMat(msg, &img);
} catch (cv_bridge::Exception& e) {
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
// 现在你可以处理img作为OpenCV的Mat了
std::cout << "Received an image with size: " << img.size() << std::endl;
// ... 进行进一步的图像处理操作 ...
// 可能的操作,例如显示图片
cv::imshow("cv_bridge example", img);
cv::.waitKey(1); // 持续展示直到按键关闭
}
private:
ros::NodeHandle nh_; // ROS节点句柄
};
int main(int argc, char** argv) {
ros::init(argc, argv, "image_converter");
ImageConverter ic;
// 订阅image topic
ros::Subscriber sub = nh_.subscribe("camera/image_color", 10, &ImageConverter::imageCallback, &ic);
ros::spin(); // 开始监听循环
return 0;
}
```
在这个例子中,我们首先创建了一个`cv_bridge`实例,并在`imageCallback`函数中订阅名为"camera/image_color"的话题。当接收到新的图像消息时,它会尝试将其转换为`Mat`,如果转换成功则可以对图像进行处理。记得替换主题名为你实际使用的topic。
阅读全文