• cv_bridge中的编码模式与实现


    image_encodings.cpp文件是关于图像编码模式的源文件,其中规定了RGB的图像以及深度图的编码模式

    该编码文件image_encodings.cpp所依赖的头文件图

    命令空间  sensor_msgs::image_encodings 下的函数

    Functions

    int  bitDepth (const std::string &encoding)
    bool  hasAlpha (const std::string &encoding)
    bool  isBayer (const std::string &encoding)
    bool  isColor (const std::string &encoding)
    bool  isMono (const std::string &encoding)
    int  numChannels (const std::string &encoding)

    Variables

    const std::string  BGR8 = "bgr8"
    const std::string  MONO16 = "mono16"
    const std::string  MONO8 = "mono8"
    const std::string  TYPE_16SC1 = "16SC1"
    const std::string  TYPE_16UC1 = "16UC1"
    const std::string  TYPE_32FC1 = "32FC1"
    const std::string  TYPE_32SC1 = "32SC1"
    const std::string  TYPE_64FC1 = "64FC1"
    const std::string  TYPE_8SC1 = "8SC1"
    const std::string  TYPE_8UC1 = "8UC1"
    那么关于深度图的编码的方式 有如下:TYPE_8UC1 TYPE_64FC1 等等
    // B = bits (8, 16, 32,64), T = type (U, S, F)
    #define CHECK_BIT_DEPTH(B, T) if (encoding == TYPE_##B##T##C1 || encoding == TYPE_##B##T##C2 ||  encoding == TYPE_##B##T##C3 ||
     encoding == TYPE_##B##T##C4)    return B;
    比如使用这样编码方式,对kinect获得的深度进行显示,程序如下
    #include <ros/ros.h>                           //ros 的头文件
    #include <image_transport/image_transport.h>   //image_transport
    #include <cv_bridge/cv_bridge.h>              //cv_bridge
    #include <sensor_msgs/image_encodings.h>    //图像编码格式
    #include <opencv2/imgproc/imgproc.hpp>      //图像处理
    #include <opencv2/highgui/highgui.hpp>       //opencv GUI
    
    static const std::string OPENCV_WINDOW = "Image window";   //申明一个GUI 的显示的字符串
    
    class ImageConverter    //申明一个图像转换的类
    {
      ros::NodeHandle nh_;        //实例化一个节点
      image_transport::ImageTransport it_;
      image_transport::Subscriber image_sub_;     //订阅节点
      image_transport::Publisher image_pub_;      //发布节点
      
    public:
      ImageConverter()
        : it_(nh_)
      {
        // Subscrive to input video feed and publish output video feed
        image_sub_ = it_.subscribe("/camera/depth/image_raw", 1, &ImageConverter::imageCb, this);
        image_pub_ = it_.advertise("/image_converter/output_video", 1);
    
        cv::namedWindow(OPENCV_WINDOW);
      }
    
      ~ImageConverter()
      {
        cv::destroyWindow(OPENCV_WINDOW);
      }
    
      void imageCb(const sensor_msgs::ImageConstPtr& msg)   //回调函数
      {
        cv_bridge::CvImagePtr cv_ptr;  //申明一个CvImagePtr
        try
        {
          cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::TYPE_32FC1);
        }
        catch (cv_bridge::Exception& e)
        {
          ROS_ERROR("cv_bridge exception: %s", e.what());
          return;
        }
    //转化为opencv的格式之后就可以对图像进行操作了
        // Draw an example circle on the video stream
        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));  //画圆
    
        // Update GUI Window
        cv::imshow(OPENCV_WINDOW, cv_ptr->image);
        cv::waitKey(3);
        
        // Output modified video stream
        image_pub_.publish(cv_ptr->toImageMsg());
      }
    };
    
    int main(int argc, char** argv)
    {
      ros::init(argc, argv, "image_converter");
      ImageConverter ic;
      ros::spin();
      return 0;
    }

    最主要的就是编码的方式的正确即可实现深度图的显示


    从中我们可以看得处深度图使用cv_bridge进行转换与RGB图之间的转换为OPENCV可处理的结构基本上类似,但是最重要的就是编码的模式的正确,所以这是非常关键的
    为了使用深度图与RGB的图生成点云,所以我们需要对深度图使用正确的编码模式,具体的代码我就不再展示了,
    那么我们可以看一下,对于不同的编码模式生成点云之间的区别


    看起来就好像断层了一样,但是如果配合正确的编码的模式效果就不是这样的了,所以在使用cv_bridge的时候选择正确的编码模式是非常重要的,
    暂时就更新到这里了,如果有问题可以直接评论,或者关注微信公众号,或者加入QQ交流群与更多的人交流



  • 相关阅读:
    基础排序算法之快速排序(Quick Sort)
    基础排序算法之并归排序(Merge Sort)
    Python中With的用法
    Python中AND-OR的用法
    注解/Annotation
    初识Angular2
    Angular 2 入门二
    Angular2 入门
    asp中将系统货币符号¥改为美国货币符号$的做法
    设计模式总结
  • 原文地址:https://www.cnblogs.com/li-yao7758258/p/6663723.html
Copyright © 2020-2023  润新知