服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - OpenCV cv.Mat与.txt文件数据的读写操作

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

2021-06-24 11:21可乐洋芋头 C/C++

这篇文章主要介绍了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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#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);
}

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

原文链接:https://blog.csdn.net/LJH0600301217/article/details/8731190

延伸 · 阅读

精彩推荐
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29