klg日志文件中提取RGBD图像数据
main函数
本程序用于从klg日志文件中提取RGB图像和Depth图像信息,klg文件在ElasticFusion中被用于保存数据集。
涉及的相关开源代码如下:
LogView
mp3guy/Logger1
mp3guy/Logger2
HTLife/png_to_klg
#include "Resolution.h"
#include "RawLogReader.h"
#include <fstream>
#include <iomanip>
#include <string>
#include <iostream>int find_argument(int argc, char** argv, const char* argument_name)
{for(int i = 1; i < argc; ++i){if(strcmp(argv[i], argument_name) == 0){return i;}}return -1;
}int parse_argument (int argc, char** argv, const char* str, int &val)
{int index = find_argument (argc, argv, str) + 1;if (index > 0 && index < argc )val = atoi (argv[index]);return (index - 1);
}int parse_argument (int argc, char** argv, const char* str, std::string &val)
{int index = find_argument (argc, argv, str) + 1;if (index > 0 && index < argc )val = argv[index];return index - 1;
}int main(int argc, char * argv[])
{int width = 640;int height = 480;parse_argument(argc, argv, "-w", width);parse_argument(argc, argv, "-h", height);Resolution::getInstance(width, height);Bytef * decompressionBuffer = new Bytef[Resolution::getInstance().numPixels() * 2]; //存储深度图的指针IplImage * deCompImage = 0; //存储rgb图的指针std::string logFile;assert(parse_argument(argc, argv, "-l", logFile) > 0 && "Please provide a log file");RawLogReader logReader(decompressionBuffer,deCompImage,logFile,find_argument(argc, argv, "-f") != -1);cv::Mat1b tmp(height, width);cv::Mat3b depthImg(height, width);while(logReader.hasMore()){logReader.getNext();cv::Mat3b rgbImg(height, width, (cv::Vec<unsigned char, 3> *)logReader.deCompImage->imageData);cv::Mat1w depth(height, width, (unsigned short *)&decompressionBuffer[0]);cv::normalize(depth, tmp, 0, 255, cv::NORM_MINMAX, 0);cv::cvtColor(tmp, depthImg, CV_GRAY2RGB);// cv::imshow("RGB", rgbImg);std::cout<<setiosflags(std::ios::fixed)<<logReader.timestamp<<std::endl;cv::imwrite("rgb"+std::to_string(logReader.timestamp)+".png",rgbImg);cv::imwrite("depth"+std::to_string(logReader.timestamp)+".png",depth);
// cv::imshow("Depth", depthImg);char key = cv::waitKey(1);if(key == 'q')break;else if(key == ' ')key = cv::waitKey(0);if(key == 'q')break;}delete [] decompressionBuffer;if(deCompImage){cvReleaseImage(&deCompImage);}return 0;
}
Resolution.h文件
/** Resolution.h** Created on: 18 Nov 2012* Author: thomas*/#ifndef RESOLUTION_H_
#define RESOLUTION_H_#include <cassert>class Resolution
{public:static const Resolution & getInstance(int width = 0, int height = 0){static const Resolution instance(width, height);return instance;}const int & width() const{return imgWidth;}const int & height() const{return imgHeight;}const int & cols() const{return imgWidth;}const int & rows() const{return imgHeight;}const int & numPixels() const{return imgNumPixels;}private:Resolution(int width, int height): imgWidth(width),imgHeight(height),imgNumPixels(width * height){assert(width > 0 && height > 0);}const int imgWidth;const int imgHeight;const int imgNumPixels;
};#endif /* RESOLUTION_H_ */
RawLogReader.h文件
/** RawLogReader.h** Created on: 19 Nov 2012* Author: thomas*/#ifndef RAWLOGREADER_H_
#define RAWLOGREADER_H_#include <cassert>
#include "Resolution.h"
#include <zlib.h>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <string>
#include <boost/filesystem.hpp>class RawLogReader
{public:RawLogReader(Bytef *& decompressionBuffer,IplImage *& deCompImage,std::string file,bool flipColors);virtual ~RawLogReader();void getNext();int getNumFrames();bool hasMore();Bytef *& decompressionBuffer;IplImage *& deCompImage;unsigned char * depthReadBuffer;unsigned char * imageReadBuffer;int64_t timestamp;int32_t depthSize;int32_t imageSize;private:const std::string file;FILE * fp;int32_t numFrames;int currentFrame;bool flipColors;bool isCompressed;
};#endif /* RAWLOGREADER_H_ */
RawLogReader.cpp文件
/** RawLogReader.cpp** Created on: 19 Nov 2012* Author: thomas*/#include "RawLogReader.h"/*** @brief* @param [in] deCompImage 指向depth图的指针* @param [in] decompressionBuffer 指向RGB图的指针* @param [in] file 输入的klg文件地址* @param [in] flipColors 是否翻转颜色的bool变量* */
RawLogReader::RawLogReader(Bytef *& decompressionBuffer,IplImage *& deCompImage,std::string file,bool flipColors): decompressionBuffer(decompressionBuffer),deCompImage(deCompImage),file(file),flipColors(flipColors), isCompressed(false)
{assert(boost::filesystem::exists(file.c_str()));fp = fopen(file.c_str(), "rb"); //以binary方式读入文件,得到文件指针fpcurrentFrame = 0;assert(fread(&numFrames, sizeof(int32_t), 1, fp)); //文件的第一行是一个int32_t类型的帧数depthReadBuffer = new unsigned char[Resolution::getInstance().numPixels() * 2]; //深度图是16UC1的,所以一个像素占用16bitimageReadBuffer = new unsigned char[Resolution::getInstance().numPixels() * 3]; //RGB图是8UC1的,一个像素占用8bit
}RawLogReader::~RawLogReader()
{delete [] depthReadBuffer;delete [] imageReadBuffer;fclose(fp);
}void RawLogReader::getNext()
{assert(fread(×tamp, sizeof(int64_t), 1, fp));assert(fread(&depthSize, sizeof(int32_t), 1, fp));assert(fread(&imageSize, sizeof(int32_t), 1, fp));assert(fread(depthReadBuffer, depthSize, 1, fp));if(imageSize > 0){assert(fread(imageReadBuffer, imageSize, 1, fp));}if(deCompImage != 0){cvReleaseImage(&deCompImage);}CvMat tempMat = cvMat(1, imageSize, CV_8UC1, (void *)imageReadBuffer);if(imageSize == Resolution::getInstance().numPixels() * 3){isCompressed = false;deCompImage = cvCreateImage(cvSize(Resolution::getInstance().width(), Resolution::getInstance().height()), IPL_DEPTH_8U, 3);memcpy(deCompImage->imageData, imageReadBuffer, Resolution::getInstance().numPixels() * 3);}else if(imageSize > 0){isCompressed = true;deCompImage = cvDecodeImage(&tempMat);}else{isCompressed = false;deCompImage = cvCreateImage(cvSize(Resolution::getInstance().width(), Resolution::getInstance().height()), IPL_DEPTH_8U, 3);memset(deCompImage->imageData, 0, Resolution::getInstance().numPixels() * 3);}if(depthSize == Resolution::getInstance().numPixels() * 2){//RGB should not be compressed in this caseassert(!isCompressed);memcpy(&decompressionBuffer[0], depthReadBuffer, Resolution::getInstance().numPixels() * 2);}else if(depthSize > 0){//RGB should also be compressedassert(isCompressed);unsigned long decompLength = Resolution::getInstance().numPixels() * 2;uncompress(&decompressionBuffer[0], (unsigned long *)&decompLength, (const Bytef *)depthReadBuffer, depthSize);}else{isCompressed = false;memset(&decompressionBuffer[0], 0, Resolution::getInstance().numPixels() * 2);}if(flipColors){cv::Mat3b rgb(Resolution::getInstance().rows(), Resolution::getInstance().cols(), (cv::Vec<unsigned char, 3> *)deCompImage->imageData, Resolution::getInstance().width() * 3);cv::cvtColor(rgb, rgb, CV_RGB2BGR);}currentFrame++;
}int RawLogReader::getNumFrames()
{return numFrames;
}bool RawLogReader::hasMore()
{return currentFrame + 1 < numFrames;
}
klg日志文件中提取RGBD图像数据相关推荐
- ffmpeg-从mp4、flv、ts文件中提取264视频流数据
ffmpeg-从mp4.flv.ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #in ...
- ffmpeg-从flv文件中提取AAC音频数据保存为文件
AAC ADTS格式协议: 从flv文件中提取AAC音频数据保存为文件. 如果需要详细了解AAC ADTS格式,可以查询文档. 原文件: 提取aac文件: main.c #include <st ...
- 如何从 Apache 和 NGINX 服务器的日志文件中提取 IP 地址
作为系统管理员,您需要密切关注访问您网站的 IP 地址.服务器日志是此类信息的有用来源.它们包含您的服务器收到的每个请求的 IP 地址.日期时间.请求类型.URL.服务器响应等.在本文中,我们将了解如 ...
- 实战:从文件夹中庞大的excel(.xlsx)文件中提取并整合数据
从文件夹中庞大的excel(.xlsx)文件中提取并整合数据 Input 需要从文件夹树中提取有格式的单个数据格并汇总. 例如: 2017-2020x市蚊虫数据/2018/7月/abcds方法统计.x ...
- C语言 从txt文件中提取特定的数据
C语言:从txt中逐行读取文本,提取其中的特殊数据 在Matlab中几行正则化的操作,C中尝试实现. 问题描述 在大量的txt中提取其中的特定数据 例如: Labeled Markers (4):Ma ...
- 在csv文件中提取特定的数据做图-以天气为例子
前言:这是在<python入门>中的一个例子,写成文章,作为学习的复盘. 现在有这么一份天气数据,需要将画出最高温和最低温的曲线图. 前期的基础知识: CSV文件 CSV是最通用的一种文件 ...
- python调用simulink_使用Python从dbc文件中提取simulink建模数据定义
使用dbc文件建模完成CAN通讯是一种比较高效的开发模式,不过在建模的过程中dbc文件中描述的数据需要自己去定义.使用文本编辑工具打开dbc文件可以看到,实际上dbc文件是一个可以进行语义解析的文本. ...
- 从flv文件中提取音频并存储为mp3格式
在优酷上下载了一些教学视频,为了把它们放到mp3里面,需要从这些flv文件中提取出音频数据并存储为mp3格式. 操作系统是centos 5.3. 在网上搜索了一下,找到以下方法: 方法一:使用menc ...
- gnuradio上怎么使用python文件_使用Python从PDF文件中提取数据
前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...
最新文章
- RDKit | 通过分析活性化合物确定指标阈值
- Highcharts X轴纵向显示
- 反编译华为U8825D“framework-res.apk”出现的错误提示(1)
- Android开机启动流程初探
- 二分查找的实现---java版本
- 打印出不同顺序的字符串单引号和双引号的差异
- java 模块开发_java模块化开发
- mysql not in优化_98%的人不知道的MySQL优化器原理
- 消息持续积压几小时怎么办
- 学习C++项目——数据库知识学习(主从原理,分离配置,远程工具只是了解,都没有实现)
- vs2019键盘钩子_江门网站建设:针对Web开发人员的12个最佳Visual Studio代码扩展
- matlab动态仿真实例教程,MATLAB R2008控制系统动态仿真实例教程_IT教程网
- [Spark版本更新]--Spark-2.4.0 发布说明
- 2011年下半年11月份系统架构设计师上午试题答案之二
- 正交补与矩阵的正交补
- retrofit原理面试,2021最新百度、头条等公司Android社招面试题目,含答案解析
- 阿里测试岗,面试官狂问自动化,把我问到哑口无言……
- OpenGL深入探索——阴影贴图(二)
- 沈剑老师的MySQL军规
- Java里面的四种内存屏障
热门文章
- 什么是软件服务化(SaaS)
- Elasticsearch之路由
- 网页html5播放器,一个强大的开源HTML5视频播放器,字节出品
- 虚商两年仅2000万用户 2016发展前景不明
- STC89C52RC的特殊功能寄存器
- 吉林大学软件学院——UMl作业3
- SRRC检测项目与标准 无线测试
- VideoPose3d:环境搭建+制作自己的视频
- windows下安装ROS 2 Foxy详解
- python elasticsearch 提示 ‘update‘ API and will be removed