cv_bridge中的编码模式与实现
来源:互联网 发布:布谷鸟软件 编辑:程序博客网 时间:2024/06/05 03:28
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 GUIstatic 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交流群与更多的人交流
0 0
- cv_bridge中的编码模式与实现
- cv_bridge与OpenCV版本问题
- 游戏中的设计模式与编码原则
- 利用cv_bridge与ROS的SUB通信
- 字符与编码在程序中的实现
- python中的编码模式
- Singleton模式与在Ogre中的实现
- Singleton模式与在Ogre中的实现
- JAVA转换与编码模式
- 字符转换与编码模式
- C# 中的编码转换实现
- 计算机中的数制与编码
- javascript 中的编码与解码
- java中的编码与解码
- javascript中的编码与解码
- javascript中的编码与解码
- javascript中的编码与解码
- javascript中的编码与解码
- 用户登录记录密码
- 文件读写-流的操作
- 有关eclipse选项框乱码问题
- 浅谈用户及用户组
- PCL特征点与配准(1)
- cv_bridge中的编码模式与实现
- Selenium在Firefox中踩过的
- PCL常见错误集锦
- redis常用命令
- Struts Spring 实现 JSP 读取数据库
- Tcp 三次握手与四次挥手
- 第二章——继承(2)
- javascript立即执行函数的两种写法
- java常用算法题