• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ROS Sensor_msgs/Image和OpenCV Mat互转

武飞扬头像
stan-coder
帮助1

一、摘要

ROS 以自己的 sensor_msgs/Image 消息格式传递图像,但许多用户希望将图像与 OpenCV 结合使用。 CvBridge 是一个 ROS 库,提供 ROS 和 OpenCV 之间的接口。 CvBridge 可以在 vision_opencv 堆栈中的 cv_bridge 包中找到。

学新通

 二、干货

需要的头文件

  1.  
    #include "ros/ros.h"
  2.  
    #include <sensor_msgs/Image.h>
  3.  
    #include <cv_bridge/cv_bridge.h>
  4.  
    #include "opencv2/opencv.hpp"

A)cv::Mat 转 sensor_msgs::Image

  1.  
    cv::Mat image;
  2.  
    sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();

B)sensor_msgs::Image 转 cv::Mat

  1.  
    cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::TYPE_8UC3);
  2.  
    cv::Mat img = cv_ptr->image;

三、一个小Demo

  1.  
    #include <ros/ros.h>
  2.  
    #include <image_transport/image_transport.h>
  3.  
    #include <cv_bridge/cv_bridge.h>
  4.  
    #include <sensor_msgs/image_encodings.h>
  5.  
    #include <opencv2/imgproc/imgproc.hpp>
  6.  
    #include <opencv2/highgui/highgui.hpp>
  7.  
     
  8.  
    static const std::string OPENCV_WINDOW = "Image window";
  9.  
     
  10.  
    class ImageConverter
  11.  
    {
  12.  
    ros::NodeHandle nh_;
  13.  
    image_transport::ImageTransport it_;
  14.  
    image_transport::Subscriber image_sub_;
  15.  
    image_transport::Publisher image_pub_;
  16.  
     
  17.  
    public:
  18.  
    ImageConverter()
  19.  
    : it_(nh_)
  20.  
    {
  21.  
    // Subscrive to input video feed and publish output video feed
  22.  
    image_sub_ = it_.subscribe("/camera/image_raw", 1,
  23.  
    &ImageConverter::imageCb, this);
  24.  
    image_pub_ = it_.advertise("/image_converter/output_video", 1);
  25.  
     
  26.  
    cv::namedWindow(OPENCV_WINDOW);
  27.  
    }
  28.  
     
  29.  
    ~ImageConverter()
  30.  
    {
  31.  
    cv::destroyWindow(OPENCV_WINDOW);
  32.  
    }
  33.  
     
  34.  
    void imageCb(const sensor_msgs::ImageConstPtr& msg)
  35.  
    {
  36.  
    cv_bridge::CvImagePtr cv_ptr;
  37.  
    try
  38.  
    {
  39.  
    cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
  40.  
    }
  41.  
    catch (cv_bridge::Exception& e)
  42.  
    {
  43.  
    ROS_ERROR("cv_bridge exception: %s", e.what());
  44.  
    return;
  45.  
    }
  46.  
     
  47.  
    // Draw an example circle on the video stream
  48.  
    if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
  49.  
    cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));
  50.  
     
  51.  
    // Update GUI Window
  52.  
    cv::imshow(OPENCV_WINDOW, cv_ptr->image);
  53.  
    cv::waitKey(3);
  54.  
     
  55.  
    // Output modified video stream
  56.  
    image_pub_.publish(cv_ptr->toImageMsg());
  57.  
    }
  58.  
    };
  59.  
     
  60.  
    int main(int argc, char** argv)
  61.  
    {
  62.  
    ros::init(argc, argv, "image_converter");
  63.  
    ImageConverter ic;
  64.  
    ros::spin();
  65.  
    return 0;
  66.  
    }
学新通

四、参考

cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages - ROS Wiki

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjjkic
系列文章
更多 icon
同类精品
更多 icon
继续加载