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);
}

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

时间: 2018-05-01

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

pandas 把数据写入txt文件每行固定写入一定数量的值方法

我遇到的情况是:把数据按一定的时间段提出.比如提出每天6:00-8:00的每个数据,可以这样做: # -*-coding: utf-8 -*- import pandas as pd import datetime #读取csv文件 df=pd.read_csv('A_2+20+DoW+VC.csv') #求'ave_time'这一列的平均值 aveTime=df['ave_time'].mean() #把ave_time这列的缺失值进进行填充,填充的方法是按这一列的平均值进行填充 df2=df

详解opencv中画圆circle函数和椭圆ellipse函数

1.      void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1,   int lineType = LINE_8, int shift = 0); ellipse函数将椭圆画到图像 lmg 上, 椭圆中心为点center,并且大小位于矩形 axes

将pandas.dataframe的数据写入到文件中的方法

导入实验常用的python包.如图2所示. [import pandas as pd]pandas用来做数据处理.[import numpy as np]numpy用来做高维度矩阵运算.[import matplotlib.pyplot as plt]matplotlib用来做数据可视化. pandas数据写入到csv文件中: [names = ['Bob','Jessica','Mary','John','Mel']]创建一个names列表[ births = [968,155,77,578,

Python打开文件,将list、numpy数组内容写入txt文件中的方法

python保存numpy数据: numpy.savetxt("result.txt", numpy_data); 保存list数据: file=open('data.txt','w') file.write(str(list_data)); file.close() 以上这篇Python打开文件,将list.numpy数组内容写入txt文件中的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

浅谈python中对于json写入txt文件的编码问题

最近一直在研究python+selenium+beautifulsoup的爬虫,但是存入数据库还有写入txt文件里面的时候一直都是unicode编码的格式. 接下来就是各种翻阅文档,查找谷歌和度娘,但是都没有具体的说明是什么问题. 结果根据自己的代码发现,原来是一句代码写到后面去了. name = json.dumps('中国你好', ensure_ascii=False) #重点就是这一句代码 date = time.strftime('%Y-%m-%d', time.localtime(ti

Android存储字符串数据到txt文件

需求: android存储字符串数据简单的有SharePerfence不过只能存储89kb最多的数据(好像),超过这个数据如果不方便网络存储,只能用文件存储了,这里写了一个工具类,存储到txt文件(不重要的数据,但是体量大) 代码: 1.工具类 package com.xxx.util; import android.os.Environment; import android.util.Log; import java.io.BufferedReader; import java.io.Fil

python批量读取文件名并写入txt文件中

本文实例为大家分享了python批量读取文件名并写入txt中的具体代码,供大家参考,具体内容如下 先说下脚本使用的环境吧,在做项目的过程中需要动态加载图片,使用Unity的Resources.Load方法,但是百十张图片怎么能一 一写下他们的名字作为加载的路径呢?总不能一个一个编辑后存到数组中吧,(虽然我最初是这么做的).所以必须有一个批量的工具,必须的. 于是乎激发了我的灵感,下面看代码.备注少,不动的给我留言,我会及时回复的. #coding=utf-8 import sys import

Python中使用第三方库xlutils来追加写入Excel文件示例

目前还没有更好的方法来追写Excel,lorinnn在网上搜索到以及之后用到的方法就是使用第三方库xlutils来实现了这个功能,主体思想就是先复制一份Sheet然后再次基础上追加并保存到一份新的Excel文档中去. 使用xlutils 代码实现如下: # -*- coding: utf-8 -*- ''' Created on 2012-12-17 @author: walfred @module: XLRDPkg.write_append @description: ''' import o