【OpenCV]OpenCV中序列化及反序列化方法

OpenCV中序列化及反序列化方法


前言

OpenCV提供了多种序列化操作的方式:
1.FileStorage: 这是OpenCV本身提供的序列化保存方法,非常适合保存参数。

2.二进制序列化: OpenCV mat 可以通过二进制序列化来保存,可以保存所有的mat类型。

3.XML和YAML序列化: 在OpenCV中,操作XML/YAML数据结构是cv::FileStorage。要打开磁盘上的指定文件,可以使用它的构造函数或this的open()函数。

4.JSON序列化: 在OpenCV中,可以使用JSON序列化OpenCV Mat的对象。

5.reshape函数: OpenCV的reshape函数既可以改变矩阵的通道数,又可以对矩阵元素进行序列化。
本文主要示例用FileStorage对xml数据进行序列化。FileStorage类提供了一种方便的方法来读写XML和YAML文件,你可以使用这个类来读写文件中的文本、数字、vector和map数据 。

一、对xml/yml进行序列化

示例如下:

#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	FileStorage fs("test.xml", FileStorage::WRITE); 

	int a1 = 2;
	char a2 = -1;
	string str = "hello world!";
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	vector<string> ve = {"hello","world"};
	map<string, int> m;
	m["Jack"] = 100;
	m["Poly"] = 99;
	m["Henry"] = 98;

	//写入文件操作
	fs << "int_data" << a1;
	fs << "char_data" << a2;
	fs << "string_data" << str;

	//写入数组
	fs << "array_data" << "["; //数组开始
	for (int i = 0; i < 10; i++)
	{
		fs << arr[i];
	}
	fs << "]"; //数组结束
	//写入vector
	fs <<"vector"<<ve;


	//写入map 
	fs << "map_data" << "{";  //map的开始写入
	map<string, int>::iterator it = m.begin();
	for (; it != m.end(); it++)
	{
		fs << it->first << it->second;
	}
	fs << "}";  //map写入结束
	fs.release();
	system("pause");
	return 0;
}

生成的xml文件如下:
在这里插入图片描述
生成的yml文件如下:
在这里插入图片描述

二、对xml/yml进行反序列化

示例如下:

int main()
{

	FileStorage fs("test.xml", FileStorage::READ); 
	auto b1 = (int)fs["int_data"];
	auto b2 = (int)fs["char_data"];
	auto str1 = (string)fs["string_data"];

	cout << b1 << endl;
	cout << b2 << endl;
	cout << str1 << endl;
	int arr[10];
	vector<string> ve(2);
	map<string, int> m;
	//读入数组
	FileNode arr_node = fs["array_data"];
	FileNodeIterator fni = arr_node.begin();
	FileNodeIterator fniEnd = arr_node.end();
	int count = 0;
	for (; fni != fniEnd; fni++)
	{
		arr[count++] = (int)(*fni) + 10;
		
	}
	for (auto value : arr)
	{
		cout << value << endl;
	}
	//读入vector
	int count1 = 0;
	FileNode vec_node = fs["vector"];
	FileNodeIterator vecBegin = vec_node.begin();
	FileNodeIterator vecEnd = vec_node.end();
	for (; vecBegin != vecEnd; vecBegin++)
	{
		ve[count1++] = (string)(*vecBegin) + "S";
	}
	for (auto value : ve)
	{
		cout << value << endl;
	}
	//读入map
	FileNode map_node = fs["map_data"];
	m["a1"] = (int)map_node["Jack"];
	m["a2"] = (int)map_node["Poly"];
	m["a3"] = (int)map_node["Henry"];

	cout << m["a1"] << endl;
	cout << m["a2"] << endl;
	cout << m["a3"] << endl;
	system("pause");
	return 0;
}

反序列化结果:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,它提供了一系列图像处理和计算机视觉算法。Opencv本身并不包含序列化功能,但是它提供了一些工具函数和方法来实现图像的序列化。 首先,Opencv常用的图像格式包括JPEG、PNG、BMP等,这些格式本身就是一种序列化的方式。通过使用`cv::imwrite()`函数,我们可以将图像保存到本地文件。例如,下面的代码将图像保存为JPEG格式: ```cpp cv::Mat image = cv::imread("image.jpg"); cv::imwrite("serialized_image.jpg", image); ``` 此外,OpenCV还提供了一些函数来将图像数据转换为字符串,并在需要时将其还原为原始图像。例如,`cv::imencode()`函数可以将图像编码为特定格式(如JPEG、PNG等)的字节流,而`cv::imdecode()`函数则可以将字节流解码为图像数据。下面是一个示例: ```cpp // 将图像编码为JPEG格式的字节流 std::vector<uchar> bytes; cv::imencode(".jpg", image, bytes); // 将字节流解码为图像数据 cv::Mat decoded_image = cv::imdecode(bytes, cv::IMREAD_COLOR); ``` 此外,Opencv还支持将图像数据转换为XML或JSON格式的字符串,以实现更复杂的序列化反序列化操作。这可以通过使用`cv::FileStorage`类和其方法来实现。例如,可以使用`cv::FileStorage`类的`write()`方法将图像数据保存到XML文件,然后使用`read()`方法从文件读取数据并还原为图像。 总结来说,Opencv本身虽然没有直接的序列化功能,但是通过一些工具函数和方法,我们可以将图像保存到文件或者将图像数据转换为字节流等形式进行序列化操作。如果需要更复杂的序列化方式,可以使用Opencv的`cv::FileStorage`类来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shanhedian2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值