C++ 读取CSV文件中的数据到Mat
目标
最近正在做热图像的实验数据处理,热像仪上位机导出热图像视频数据是,每一帧为一个csv文件,每行像素值由逗号分隔,行与行之间是换行符,数据格式是纯文本,科学计数法。需要将全部数据存至一个mat中,以便后续使用opencv库处理。
思路
- 将读取CSV文件的函数和当前正在读取的文件操作符等放在一个类中,构造类似句柄的一个类,代表一个帧的文件。
- 类中包含如打开、关闭、检查列数、(没有写检查行数的函数)、科学计数法转浮点数等基本操作。
- Mat类引用传参。
- 以固定格式打开CSV文件,比如打开一段视频的第一帧就传入参数1。
代码
程序
读取CSV的类
//read_csv.h
#ifndef READ_CSV_H
#define READ_CSV_H
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>//istringstream 必须包含这个头文件
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
class CSV {public:CSV(int b, int r);//b为列数~CSV();void check_columns(void);//判断该数据有多少列void read_csv(int n,Mat& dest);//读取哪一帧数据void file_close(void);//--关闭所有打开的文件void open_csv(int idx);//打开第idx帧的文件/*void creat_new_csv(void);//--创建一个新的csv文件void write_csv(void);//--将需要的数据写入新csv文件中*/
public:int columns;
private:string filename_base = "H:/data/2__";//--打开的文件名string oneline;//--保存一行数据ifstream infile;//--输入文件流ofstream outfile;//--输出文件流int blank_rows = 0, rows, current_frame = 0;//无效行数,列数,当前帧
};
double sci2db(string& strSci);
#endif // !READ_CSV_H
filename_base 是基础文件名,在上位机导出时设置,后面跟着上位机自动补全的第几帧。
blank_rows是无效的行数,上位机会生成几行记录相关信息。
#include "read_csv.h"
/*
每一帧是一个文件
*/CSV::CSV(int b,int r=240)//构造函数
{ this->blank_rows = b; //设定空白行数check_columns();//检查列数this->rows = r;
}
CSV::~CSV() //析构函数
{ if(this->infile.is_open())this->infile.close();//有文件打开则关闭文件
}
void CSV::check_columns(void)
{open_csv(1);//打开第一帧,编号从一开始string tmp;for (int i = 0; i < blank_rows; i++){getline(this->infile, tmp);//--读取一行}getline(this->infile, tmp);//--读取一行this->columns = 1;for (int i = 0; i < tmp.size(); i++) {if (tmp[i] == ',')this->columns++;}cout <<"There exists "<<this->columns <<" columns in the file "<< endl;file_close();//关闭文件
}void CSV::read_csv(int n,Mat& dest)
{dest.create(this->rows, this->columns, CV_64FC1);open_csv(n);for (int i = 0; i < this->rows; i++) {getline(this->infile, this->oneline);//--读取一行istringstream tempstream(this->oneline);//将整行字符串line读入到字符串流istringstream中string field;int m = 0;for (int j = 0; j < this->columns; j++) {getline(tempstream, field, ',');/* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */dest.at<double>(i, j) = sci2db(field);}}file_close();//关闭文件
}
void CSV::open_csv(int idx)
{string filename = filename_base + to_string(idx) + ".csv";//--写入文件名this->infile.open(filename); //--打开文件
}
void CSV::file_close(void)
{this->infile.close();
}
double sci2db(string& strSci)
{int iPower = 0; //幂double dMntsa = 0; //尾数double dCoefficient = 1; //系数std::string strPower, strMntsa;if (std::string::npos == strSci.find("E")){return atof(strSci.c_str());}strMntsa = strSci.substr(0, strSci.find("E"));strPower = strSci.substr(strSci.find("E") + 1);dMntsa = atof(strMntsa.c_str());iPower = atoi(strPower.c_str());while (iPower != 0){if (iPower > 0){dCoefficient *= 10;iPower--;}else{dCoefficient *= 0.1;iPower++;}}return dMntsa * dCoefficient;
}
/*temp
void CSV::write_csv(void)
{this->outfile << this->fields[8] << "," << this->fields[10] << endl;
}
void CSV::creat_new_csv(void)
{this->outfile.open("out.csv", ios::out | ios::trunc);
}void CSV::open_csv(void)
{if(filename.size()!=0)this->infile.open(this->filename); //--打开文件
}
*/
主函数示例
简单写一个读取每一帧吧
#include <opencv2\opencv.hpp>
#include "read_csv.h"
using namespace cv;
using namespace std;
int start_frame = 1000, end_frame = 6000;//起始帧和终点帧
int main()
{CSV csv_1(0,240);Mat read_tmp;for (int i = start_frame; i < end_frame;i++) {csv_1.read_csv(i, read_tmp);//读取第i帧图像//···}//···//system("PAUSE ");return 0;
}
C++ 读取CSV文件中的数据到Mat相关推荐
- python获取股指_用Python读取csv文件中的沪深300指数历史交易数据
保存路径:D:\python\用Python读取csv文件中的沪深300指数历史交易数据 程序名称:readcsvhs300.py: 数据名称:沪深300指数历史交易数据.csv: 开发环境:Win7 ...
- python怎么读取csv的一部分数据_python批量读取csv文件 如何用python将csv文件中的数据读取成数组...
如何用python把多个csv文件数据处理后汇总到新csv文件你看这月光多温柔,小编转头还能看见你,一切从未坍塌. 可以用pandas读取数据,首先把文件方同一个文件价里,然后对当前文件价的所有内容循 ...
- 从csv文件中导入数据到MySQL数据库
从csv文件中导入数据到MySQL数据库 转: 一.Workbench客户端导入(8.0.11基本导不全且速度奇慢) 1.点击如下图标创建数据库(非必要) 2.在表类上右键导入 二.SQL语句导入(可 ...
- python导入txt文件并绘图-Python实现读取txt文件中的数据并绘制出图形操作示例
本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作.分享给大家供大家参考,具体如下: 下面的是某一文本文件中的数据. 6.1101,17.592 5.5277,9.1302 8.51 ...
- 用python读取txt文件中的数据并画各类图形展示_Python实现读取txt文件中的数据并绘制出图形操作示例...
本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作.分享给大家供大家参考,具体如下: 下面的是某一文本文件中的数据. 6.1101,17.592 5.5277,9.1302 8.51 ...
- 将数据写入json文件,并且读取json文件中的数据
目录 一.将数据生成json文件 二.读取json文件中的数据 三.方法测试 四.其他附件 1.User实体类 2.import 一.将数据生成json文件 方法 /*** 生成.json格式文件*/ ...
- Python读取excel文件中的数据,绘制折线图、散点图
https://www.cnblogs.com/liulinghua90/p/9935642.html https://blog.csdn.net/qq_32458499/article/detail ...
- 将 .csv文件中的数据导入My SQL数据库中
利用My SQL 将.csv文件中的数据导入数据库.首先以管理员身份运行cmd,输入指令net start mysql 运行mysql服务,然后输入指令mysql -u root -p ,输入密码.* ...
- 如何读取csv文件中第n行数据python-python数据处理之如何选取csv文件中某几行的数据...
前言 有些人看到这个问题觉得不是问题,是嘛,不就是df.col[]函数嘛,其实忽略了一个重点,那就是我们要省去把csv文件全部读取这个过程,因为如果在面临亿万级别的大规模数据,得到的结果就是boom, ...
最新文章
- 遇见BUG(1):都是非时钟专用引脚惹的祸?
- is this mysql server_Mysql:is not allowed to connect to this MySQL server
- C语言中使用库函数解析命令行参数
- 白话 Session 与 Cookie:从经营杂货店开始
- php数组的元素个数,php怎么统计数组元素的个数
- 多选框位置调整_URPC 2019 水下目标检测竞赛冠军方案:多图像融合增强
- java 匿名访问权限_java-春季安全性allowAll()不允许匿名访问
- logo、展板、彩页、手提袋总结
- Dividing the numbers CodeForces - 899C (构造)
- React引入,运行
- 微信红包技术架构,防外挂贼牛逼!(附胶片下载)
- mpython掌控板_用mpython x玩转掌控板——微信小程序 遇上掌控板
- 让局域网内部挺高网速
- 云小课 | MRS和自建Hadoop相比,有哪些优势?
- axis2生成客户端代码_利用ApiPost一键、快速生成接口文档!女猿也过38节!
- 深入学习MongoDB
- CentOS 6.5 64位 安装zabbix-2.2.0
- Bypassing Stack Cookies, SafeSeh, SEHOP, HW DEP and ASLR
- JAVA 算法 回溯
- 大众点评社区运营攻略
热门文章
- Linux 邮件服务器 之跟我一步一步来实现一个邮件系统
- SQL Server 2012安装错误案例:Error while enabling Windows feature: NetFx3, Error Code: -2146498298...
- Shell in AIX Web端 自动远程执行重启tomcat服务命令
- mysql 数据库军规_用尽洪荒之力整理的Mysql数据库32条军规(转)
- [C++再学习系列] 具有链接的C++实体
- python中异或怎么算_python中的异或运算
- 手游接入Facebook的那些坑
- python爬虫项目描述怎么写_爬虫项目咋写,爬取什么样的数据可以作为项目写在简历上?...
- 【java学习之路】(java框架)008.JdbcTemplate
- 国内达梦数据库相关函数-时间日期