OpenCV cv.Mat与.txt文件数据的读写操作

本篇文章主要介绍了OpenCV cv.Mat 与 .txt 文件数据的读写操作,小编觉得挺不错的,现在分享给大家。

1、按OpenCV格式实现的 .txt 文件读写

可以用 cvSave 和 cvLoad 实现,格式和 .xml/.yml 的差不多,不过如果专用与 OpenCV 的数据读写,还是用  .xml/.yml 文件格式较好,我比较喜欢 .yml 格式,可读性非常棒。

用 cvSave 和 cvLoad 读写 .txt 文件,其实现方式和数据格式与 .yml 文件基本一致。

例如:cvSave("camera_matrix.txt",camera_matrix);  //保存了 camera_matrix 的数组头以及和它所指的data(类似yml形式的文件)

2、导入/导出其它程序的 .txt 文件数据

可以用常规的 sprintf_s 和 fprintf_s 来实现,不过效率比较低,这里介绍一种快捷易用的方法,利用了 std 的 steam 和 vector。

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector> 

using namespace std; 

/*----------------------------
 * 功能 : 将 cv::Mat 数据写入到 .txt 文件
 *----------------------------
 * 函数 : WriteData
 * 访问 : public
 * 返回 : -1:打开文件失败;0:写入数据成功;1:矩阵为空
 *
 * 参数 : fileName [in] 文件名
 * 参数 : matData [in] 矩阵数据
 */
int WriteData(string fileName, cv::Mat& matData)
{
 int retVal = 0; 

 // 打开文件
 ofstream outFile(fileName.c_str(), ios_base::out); //按新建或覆盖方式写入
 if (!outFile.is_open())
 {
 cout << "打开文件失败" << endl;
 retVal = -1;
 return (retVal);
 } 

 // 检查矩阵是否为空
 if (matData.empty())
 {
 cout << "矩阵为空" << endl;
 retVal = 1;
 return (retVal);
 } 

 // 写入数据
 for (int r = 0; r < matData.rows; r++)
 {
 for (int c = 0; c < matData.cols; c++)
 {
 uchar data = matData.at<uchar>(r,c); //读取数据,at<type> - type 是矩阵元素的具体数据格式
 outFile << data << "\t" ; //每列数据用 tab 隔开
 }
 outFile << endl; //换行
 } 

 return (retVal);
} 

 /*----------------------------
 * 功能 : 从 .txt 文件中读入数据,保存到 cv::Mat 矩阵
 * - 默认按 float 格式读入数据,
 * - 如果没有指定矩阵的行、列和通道数,则输出的矩阵是单通道、N 行 1 列的
 *----------------------------
 * 函数 : LoadData
 * 访问 : public
 * 返回 : -1:打开文件失败;0:按设定的矩阵参数读取数据成功;1:按默认的矩阵参数读取数据
 *
 * 参数 : fileName [in] 文件名
 * 参数 : matData [out] 矩阵数据
 * 参数 : matRows [in] 矩阵行数,默认为 0
 * 参数 : matCols [in] 矩阵列数,默认为 0
 * 参数 : matChns [in] 矩阵通道数,默认为 0
 */
int LoadData(string fileName, cv::Mat& matData, int matRows = 0, int matCols = 0, int matChns = 0)
{
 int retVal = 0; 

 // 打开文件
 ifstream inFile(fileName.c_str(), ios_base::in);
 if(!inFile.is_open())
 {
 cout << "读取文件失败" << endl;
 retVal = -1;
 return (retVal);
 } 

 // 载入数据
 istream_iterator<float> begin(inFile); //按 float 格式取文件数据流的起始指针
 istream_iterator<float> end; //取文件流的终止位置
 vector<float> inData(begin,end); //将文件数据保存至 std::vector 中
 cv::Mat tmpMat = cv::Mat(inData); //将数据由 std::vector 转换为 cv::Mat 

 // 输出到命令行窗口
 //copy(vec.begin(),vec.end(),ostream_iterator<double>(cout,"\t")); 

 // 检查设定的矩阵尺寸和通道数
 size_t dataLength = inData.size();
 //1.通道数
 if (matChns == 0)
 {
 matChns = 1;
 }
 //2.行列数
 if (matRows != 0 && matCols == 0)
 {
 matCols = dataLength / matChns / matRows;
 }
 else if (matCols != 0 && matRows == 0)
 {
 matRows = dataLength / matChns / matCols;
 }
 else if (matCols == 0 && matRows == 0)
 {
 matRows = dataLength / matChns;
 matCols = 1;
 }
 //3.数据总长度
 if (dataLength != (matRows * matCols * matChns))
 {
 cout << "读入的数据长度 不满足 设定的矩阵尺寸与通道数要求,将按默认方式输出矩阵!" << endl;
 retVal = 1;
 matChns = 1;
 matRows = dataLength;
 } 

 // 将文件数据保存至输出矩阵
 matData = tmpMat.reshape(matChns, matRows).clone(); 

 return (retVal);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV图像文件批量读取编程实例

    OpenCV编程实例之图像文件批量读取. 本博文摘录<OpenCV图像处理编程实例>2.4章节,更详细的内容请参考本书. 在进行图片序列处理时,我们常常需要读取文件夹下的每一个图片,然后再进行分析处理,因此需要对文件名连续及无规则情况分开讨论.对于文件名连续的情况,文件读取就简单得多,可以利用sprintf函数实现在窗口中连续读取同一文件夹下的图片序列,而对于无规则的情况则可以采用基于C++下WIN32_ FIND_DATA文件的读取方式. 2.4.6 图像批量读取--规则 文件名连续情况下的

  • OpenCV中的cv::Mat函数将数据写入txt文件

    在使用opencv进行图像处理的过程中,经常会涉及到将文件中的数据读入到cv::Mat中,或者将cv::Mat中的数据写入到txt文件中. 下面就介绍一种我常用的将cv::Mat中的数据写入到txt文件中的方法,具体见代码: void writeMatToFile(cv::Mat& m, const char* filename) { std::ofstream fout(filename); if (!fout) { std::cout << "File Not Opene

  • OpenCV cv.Mat与.txt文件数据的读写操作

    本篇文章主要介绍了OpenCV cv.Mat 与 .txt 文件数据的读写操作,小编觉得挺不错的,现在分享给大家. 1.按OpenCV格式实现的 .txt 文件读写 可以用 cvSave 和 cvLoad 实现,格式和 .xml/.yml 的差不多,不过如果专用与 OpenCV 的数据读写,还是用  .xml/.yml 文件格式较好,我比较喜欢 .yml 格式,可读性非常棒. 用 cvSave 和 cvLoad 读写 .txt 文件,其实现方式和数据格式与 .yml 文件基本一致. 例如:cvS

  • Python实现读取TXT文件数据并存进内置数据库SQLite3的方法

    本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法.分享给大家供大家参考,具体如下: 当TXT文件太大,计算机内存不够时,我们可以选择按行读取TXT文件,并将其存储进Python内置轻量级splite数据库,这样可以加快数据的读取速度,当我们需要重复读取数据时,这样的速度加快所带来的时间节省是非常可观的,比如,当我们在训练数据时,要迭代10万次,即要从文件中读取10万次,即使每次只加快0.1秒,那么也能节省几个小时的时间了. #创建数据库并把txt文件的数据存进

  • Python读取txt文件数据的方法(用于接口自动化参数化数据)

    小试牛刀: 1.需要python如何读取文件 2.需要python操作list 3.需要使用split()对字符串进行分割 代码运行截图 : 代码(copy) #encoding=utf-8 #1.range中填写的数据 跟txt中行数保持一致 默认按照空格分隔 f_space = open(r"C:\Users\Administrator\Desktop\Space.txt","r") line_space = f_space.readlines() for i

  • C#读取txt文件数据的方法实例

    第一步新建txt文件,写入内容 我是放在D盘下的,数据以逗号隔开的,是英文逗号 第二步读取数据 在需要读取数据的页面,添加代码,就可以了 private void Phone_Load(object sender, EventArgs e) { string ReadLine; string[] array; string Path = @"D:\FrontierApp.TXT"; StreamReader reader = new StreamReader(Path,System.T

  • 对python for 文件指定行读写操作详解

    1.os.mknod("test.txt") #创建空文件 2.fp = open("test.txt",w) #直接打开一个文件,如果文件不存在则创建文件 3.关于open 模式: 详情: w:以写方式打开, a:以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+:以读写模式打开 w+:以读写模式打开 (参见 w ) a+:以读写模式打开 (参见 a ) rb:以二进制读模式打开 wb:以二进制写模式打开 (参见 w ) ab:以二进制追加模式打开 (

  • Go语言文件开关及读写操作示例

    目录 ️ 实战场景 打开关闭文件 读取文件 bufio 读取文件 写文件 ️ 实战场景 本篇博客为大家再次带来 Go 语言的基础知识,这次要学习的内容是 Go 中的文件操作. 打开关闭文件 在 Go 中操作文件,首先要做的就是导入 os 模块,该模块中具备相关函数定义. package main import ( "fmt" "os" ) func main() { // 打开文件 file, err := os.Open("./ca.txt")

  • C#操作txt文件,进行清空添加操作的小例子

    复制代码 代码如下: //把txt清空            FileStream stream = File.Open(Adr,FileMode.OpenOrCreate,FileAccess.Write);            stream.Seek(0, SeekOrigin.Begin);            stream.SetLength(0);            stream.Close();            //向txt里面追加信息            Strea

  • mysql遇到load data导入文件数据出现1290错误的解决方案

    错误出现情景 在cmd中使用mysql命令,学生信息表添加数据.使用load data方式简单批量导入数据. 准备好文本数据: xueshengxinxi.txt 文件  数据之间以tab键进行分割 执行 "load data infile 文本数据路径  into table tab_load_data"  弹出错误. #load data (载入数据)语法,要载入数据如下: 1 张三 男 江西 1 2 李四 男 四川 2 3 王五 男 上海 1 4 赵六 女 湖北 3 5 孙七 女

  • 基于JS实现快速读取TXT文件

    1 前言 最近有个需求,需要使用JS快速读取外部大数据文件(60w条记录的表).笔者尝试过使用JS读取Excel文件,但是跑了十几分钟仍未出结果,后来笔者尝试将原数据保存为TXT文件,再从TXT文件中读取数据,只需几秒钟即可读取完毕.在此分享一下,也留着以后备用. 2 案例 为方便快速理解,笔者挑选了一个数据量小.业务逻辑简单的案例:从TXT文件中读取数据,并按照原列表格式显示. 工作空间 待读取的TXT文件数据 read.html <!DOCTYPE html> <html> &

  • 基于PyQt5制作Excel文件数据去重小工具

    需求说明:将单个或者多个Excel文件数据进行去重操作,去重的列可以通过自定义制定. 开始源码说明之前,先说明一下工具的使用过程. 1.准备需要去重的数据文件. 2.使用工具执行去重操作. 3.处理完成后的结果文件. PyQt5 界面UI相关的模块引用 from PyQt5.QtWidgets import * from PyQt5.QtGui import * 核心组件 from PyQt5.QtCore import * 主题样式模块引用 from QCandyUi import Candy

随机推荐