背景:操作rosbag,目的将图片的compressed格式转raw格式,让后进行操作。发现python并没有对应的工具接口实现,而image_transport接口用起来也没有时效性(总不能将bag播放录制,过于费时费存储空间)

概要:这里介绍image_transport其中常用类型图片格式compressed到raw转换接口,当然对于存在其他类型的图片类型应该选用其他接口实现。

代码:

/// read rosbag
#include <rosbag/bag.h>
#include <rosbag/view.h>
#include <boost/foreach.hpp>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CompressedImage.h>// ros compressed/image ---> image
#include <turbojpeg.h>
#include <sensor_msgs/image_encodings.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>//rosbagtjhandle tj_;tj_ = tjInitDecompress();sensor_msgs::ImagePtr decompressJPEG(const std::vector<uint8_t>& data, const std::string& source_encoding, const std_msgs::Header& header)
{if (!tj_)tj_ = tjInitDecompress();int width, height, jpegSub, jpegColor;// Old TurboJPEG require a const_cast here. This was fixed in TurboJPEG 1.5.uint8_t* src = const_cast<uint8_t*>(data.data());if (tjDecompressHeader3(tj_, src, data.size(), &width, &height, &jpegSub, &jpegColor) != 0){return sensor_msgs::ImagePtr(); // If we cannot decode the JPEG header, silently fall back to OpenCV}sensor_msgs::ImagePtr ret(new sensor_msgs::Image);ret->header = header;ret->width = width;ret->height = height;ret->encoding = source_encoding;int pixelFormat;if (source_encoding == enc::MONO8){ret->data.resize(height*width);ret->step = ret->width;pixelFormat = TJPF_GRAY;}else if (source_encoding == enc::RGB8){ret->data.resize(height*width*3);ret->step = width*3;pixelFormat = TJPF_RGB;}else if (source_encoding == enc::BGR8){ret->data.resize(height*width*3);ret->step = width*3;pixelFormat = TJPF_BGR;}else if (source_encoding == enc::RGBA8){ret->data.resize(height*width*4);ret->step = width*4;pixelFormat = TJPF_RGBA;}else if (source_encoding == enc::BGRA8){ret->data.resize(height*width*4);ret->step = width*4;pixelFormat = TJPF_BGRA;}else if (source_encoding.empty()){// Autodetect based on imageif(jpegColor == TJCS_GRAY){ret->data.resize(height*width);ret->step = width;ret->encoding = enc::MONO8;pixelFormat = TJPF_GRAY;}else{ret->data.resize(height*width*3);ret->step = width*3;ret->encoding = enc::RGB8;pixelFormat = TJPF_RGB;}}else{ROS_WARN_THROTTLE(10.0, "Encountered a source encoding that is not supported by TurboJPEG: '%s'", source_encoding.c_str());return sensor_msgs::ImagePtr();}if (tjDecompress2(tj_, src, data.size(), ret->data.data(), width, 0, height, pixelFormat, 0) != 0){ROS_WARN_THROTTLE(10.0, "Could not decompress data using TurboJPEG, falling back to OpenCV");return sensor_msgs::ImagePtr();}return ret;
}

若该接口未能满足需求,可以参考image_transport里面其他图片格式的转换方式。

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦点赞收藏哈

ROS学习笔记52--rosbag图片从compressed格式转raw格式代码实现接口介绍相关推荐

  1. 《算法图解》学习笔记(四):分而治之和快速排序(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  2. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

  3. ROS学习笔记之——EVO工具的使用

    之前博客<ROS学习笔记之--VICON的使用>用vincon获得了机器人的真实轨迹,并且通过amcl可以获得了机器人的定位结果,下面通过EVO包来表征performance(本文不像网上 ...

  4. ROS学习笔记(1):发布者和订阅者

    ROS学习笔记(1):publishers and subscribers 1.ros通信简介 2.C++中的类与对象 3.publishers/subscribers 4.常用指令 1.ros通信简 ...

  5. ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

    ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...

  6. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

    ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...

  7. ROS 学习笔记(一):工作空间+功能包创建

    ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...

  8. ROS学习—opencv使用之图片传输

    ROS学习-opencv使用之图片传输 前提操作:ros已安装,opencv已安装. 首先在工作空间中新建一个功能包rosopencv catkin_create_pkg rosopencv sens ...

  9. ROS学习笔记(八): ROS通信架构

    ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...

最新文章

  1. 「BAT面试现场」如何判断一个数是否在40亿个整数中?
  2. mysql 主从复制 双主从复制原理   防止主键重复问题(必看)
  3. 入选《2021爱分析·区域性银行数字化厂商全景报告》,网易云信助力南京银行打造转型标杆
  4. PyQt5学习笔记06----Qt Designer自定义信号emit及传参
  5. python ----元组方法以及修改细节
  6. 如何从视频中删除声音?
  7. gitee怎么看用户名_怎么优雅的写博客 Typora + picGo
  8. 【HDU - 3038】How Many Answers Are Wrong 【带权并查集 - 向量偏移】
  9. C语言程序段的定义、实际应用分析
  10. 2003-2007回顾贴:yeguiren个人随笔
  11. MFC仿QQ好友列表控件
  12. BZOJ1001狼抓兔子(网络流最小割)
  13. 计算机复制功能快捷键,电脑复制快捷键是什么(全部复制粘贴的快捷键是什么)...
  14. 报价单与贸易术语关系
  15. 带着孩子学数学--经验总结1:乘法怎么教,小学数学阶段等等
  16. 我撑伞,在石桥上等你
  17. ARM 之 STM32F407zgt6 外设篇 ----------- FLASH 存储部分数据
  18. 笔记本每次启动都会先黑屏1分钟再启动问题解决
  19. 深入理解FlexRay传输层协议ISO10681-2
  20. 高中计算机专业满分多少,高中各科满分是多少

热门文章

  1. 最优化问题及其分类——决策变量、目标函数、约束条件
  2. Web前端大作业—电影网页介绍8页(html+css+javascript) 带登录注册表单
  3. Hyper-V的CentOS设置固定IP
  4. PHP房贷计算器【附代码、简洁能用、亲测有效】
  5. .net core 获取程序中文件路径
  6. 用js实现一个无聊名字的生成器
  7. 创业家:最危险七团购网 高朋团宝窝窝在列
  8. SV学习笔记—包package的使用
  9. 推荐一款淘宝屏蔽和降权的检测查询工具软件
  10. PHP使用copy函数复制windows文件时出现failed to open stream: Invalid argument in错误