开发者社区> being_young123> 正文

cv_bridge中的编码模式与实现

简介: image_encodings.cpp文件是关于图像编码模式的源文件,其中规定了RGB的图像以及深度图的编码模式 该编码文件image_encodings.cpp所依赖的头文件图 命令空间  sensor_msgs::image_encodings 下的函数 Functions int...
+关注继续查看

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交流群与更多的人交流

 




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
RGB转换为NV12的代码
RGB转换为NV12的代码
31 0
SATA系列专题之二: 2.1 Link layer链路层8b/10b编码解析
8b/10b编码是目前高速串行通信中经常用到的一种编码方式,直观的理解就是把8bit数据编码成10bit来传输。
29 0
1000BASE-T/SX/LX/EX/ZX代表哪种SFP光模块?
今天给大家介绍常见的SFP光模块1000BASE-SX、1000BASE-LX、1000BASE-EX、1000BASE-ZX、1000BASE-T这五种传输介质标准代表是哪种光模块呢?1000BASE-LX、1000BASE-LH和1000BASE-LX/LH SFP光模块它们又有哪些区别?现由专业光模块制造商-易天光通信在本文中详细为你解答。
1352 0
IPC网络高清摄像机基础知识4(Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别) 【转】
转自:http://blog.csdn.net/times_poem/article/details/51682785 [-] 一 概念介绍 二 两个疑问 三 RAW和JPEG的区别  1 概念说明 32 为何要拍摄RAW  33 JPEG格式有什么优点  34 我...
1346 0
如何去掉PNG的Alpha通道
为PNG去除Alpha通道的方法很多,设计师可以使用PS或Fireworks。 为什么要为PNG图形去除Alpha通道,一张图片通常由RGBa4个标识位构成,称为32bit图片。
1644 0
+关注
being_young123
SLAM 三维视觉的点云处理 概率机器人 多视图几何
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载