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(&timestamp, 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图像数据相关推荐

  1. ffmpeg-从mp4、flv、ts文件中提取264视频流数据

    ffmpeg-从mp4.flv.ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #in ...

  2. ffmpeg-从flv文件中提取AAC音频数据保存为文件

    AAC ADTS格式协议: 从flv文件中提取AAC音频数据保存为文件. 如果需要详细了解AAC ADTS格式,可以查询文档. 原文件: 提取aac文件: main.c #include <st ...

  3. 如何从 Apache 和 NGINX 服务器的日志文件中提取 IP 地址

    作为系统管理员,您需要密切关注访问您网站的 IP 地址.服务器日志是此类信息的有用来源.它们包含您的服务器收到的每个请求的 IP 地址.日期时间.请求类型.URL.服务器响应等.在本文中,我们将了解如 ...

  4. 实战:从文件夹中庞大的excel(.xlsx)文件中提取并整合数据

    从文件夹中庞大的excel(.xlsx)文件中提取并整合数据 Input 需要从文件夹树中提取有格式的单个数据格并汇总. 例如: 2017-2020x市蚊虫数据/2018/7月/abcds方法统计.x ...

  5. C语言 从txt文件中提取特定的数据

    C语言:从txt中逐行读取文本,提取其中的特殊数据 在Matlab中几行正则化的操作,C中尝试实现. 问题描述 在大量的txt中提取其中的特定数据 例如: Labeled Markers (4):Ma ...

  6. 在csv文件中提取特定的数据做图-以天气为例子

    前言:这是在<python入门>中的一个例子,写成文章,作为学习的复盘. 现在有这么一份天气数据,需要将画出最高温和最低温的曲线图. 前期的基础知识: CSV文件 CSV是最通用的一种文件 ...

  7. python调用simulink_使用Python从dbc文件中提取simulink建模数据定义

    使用dbc文件建模完成CAN通讯是一种比较高效的开发模式,不过在建模的过程中dbc文件中描述的数据需要自己去定义.使用文本编辑工具打开dbc文件可以看到,实际上dbc文件是一个可以进行语义解析的文本. ...

  8. 从flv文件中提取音频并存储为mp3格式

    在优酷上下载了一些教学视频,为了把它们放到mp3里面,需要从这些flv文件中提取出音频数据并存储为mp3格式. 操作系统是centos 5.3. 在网上搜索了一下,找到以下方法: 方法一:使用menc ...

  9. gnuradio上怎么使用python文件_使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

最新文章

  1. RDKit | 通过分析活性化合物确定指标阈值
  2. Highcharts X轴纵向显示
  3. 反编译华为U8825D“framework-res.apk”出现的错误提示(1)
  4. Android开机启动流程初探
  5. 二分查找的实现---java版本
  6. 打印出不同顺序的字符串单引号和双引号的差异
  7. java 模块开发_java模块化开发
  8. mysql not in优化_98%的人不知道的MySQL优化器原理
  9. 消息持续积压几小时怎么办
  10. 学习C++项目——数据库知识学习(主从原理,分离配置,远程工具只是了解,都没有实现)
  11. vs2019键盘钩子_江门网站建设:针对Web开发人员的12个最佳Visual Studio代码扩展
  12. matlab动态仿真实例教程,MATLAB R2008控制系统动态仿真实例教程_IT教程网
  13. [Spark版本更新]--Spark-2.4.0 发布说明
  14. 2011年下半年11月份系统架构设计师上午试题答案之二
  15. 正交补与矩阵的正交补
  16. retrofit原理面试,2021最新百度、头条等公司Android社招面试题目,含答案解析
  17. 阿里测试岗,面试官狂问自动化,把我问到哑口无言……
  18. OpenGL深入探索——阴影贴图(二)
  19. 沈剑老师的MySQL军规
  20. Java里面的四种内存屏障

热门文章

  1. 什么是软件服务化(SaaS)
  2. Elasticsearch之路由
  3. 网页html5播放器,一个强大的开源HTML5视频播放器,字节出品
  4. 虚商两年仅2000万用户 2016发展前景不明
  5. STC89C52RC的特殊功能寄存器
  6. 吉林大学软件学院——UMl作业3
  7. SRRC检测项目与标准 无线测试
  8. VideoPose3d:环境搭建+制作自己的视频
  9. windows下安装ROS 2 Foxy详解
  10. python elasticsearch 提示 ‘update‘ API and will be removed