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

2025-05-27 0 23

本篇文章主要介绍了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);

}

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 OpenCV cv.Mat与.txt文件数据的读写操作 https://www.kuaiidc.com/73034.html

相关文章

发表评论
暂无评论