上位机图像处理和嵌入式模块部署(二进制图像的读写)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

之前我们说过,对于图像处理而言,势必会涉及到文件的读写。但是不同格式文件的读写,这本身又是体力活,而且很多的第三方库已经帮我们实现了,比如opencv。所以,这个时候其实没有必要把精力放在文件的解析上面,然而我们在改进算法、优化性能、软硬件一体开发的同时,肯定也会涉及到文件的读写,所以这个时候建议还是用二进制文件来解决。比如说,输入到arm soc或者是mcu的时候,就会用二进制文件来代替真实的图像文件,处理完了再用python或者类似的工具恢复成bmp、或者jpeg、png图片就可以了。

1、二进制文件的格式

所谓二进制文件,就是说,文件的读取和写入都是采用二进制格式保存的。文件的前面8个字节分别代表高度和宽度。每个数据各有4个字节,且存储的时候是按照大端的方式保存的。在高度和宽度数据之后呢,就是图像数据,数据的数量就是高度乘以宽度的数值。数据中的内容,就是图像数据,一般是单字节,按照从上到下、从左到右依次保存。

复制代码
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdint>
#include <Winsock2.h>

#pragma comment(lib, "Ws2_32.lib")

// image header
struct Dimensions 
{
	uint32_t height;
	uint32_t width;
};

2、写入二进制文件

写入二进制文件,一般就是把处理好的图像数据写入到文件当中去。这里面需要注意的地方,就是前面8个字节写入的时候需要进行htonl转换。后面的数据依次写入即可。

复制代码
// write binary file here
void write_binary_file(const std::string& filename, const Dimensions& dimensions, const std::vector<uint8_t>& data)
{
	std::ofstream file(filename, std::ios::binary);

	if (!file.is_open()) 
	{
		std::cerr << "Error opening file for writing." << std::endl;
		return;
	}

	// Write length and width in big-endian format
	uint32_t heightBE = htonl(dimensions.height);
	uint32_t widthBE = htonl(dimensions.width);

	file.write(reinterpret_cast<const char*>(&heightBE), sizeof(uint32_t));
	file.write(reinterpret_cast<const char*>(&widthBE), sizeof(uint32_t));

	// Write data
	file.write(reinterpret_cast<const char*>(data.data()), data.size());

	file.close();
}

3、读取二进制数据

二进制数据的读取,一般也是用于算法处理前的预操作。另外,和写入数据一样,读取数据的时候需要进行字节序的转换,即ntohl。后面的数据依次读取就可以了。

复制代码
// read binary file here
void read_binary_file(const std::string& filename, Dimensions& dimensions, std::vector<uint8_t>& data) 
{
	std::ifstream file(filename, std::ios::binary);

	if (!file.is_open()) 
	{
		std::cerr << "Error opening file for reading." << std::endl;
		return;
	}

	// Read length and width in big-endian format
	uint32_t heightBE, widthBE;

	file.read(reinterpret_cast<char*>(&heightBE), sizeof(uint32_t));
	file.read(reinterpret_cast<char*>(&widthBE), sizeof(uint32_t));

	dimensions.height = ntohl(heightBE);
	dimensions.width = ntohl(widthBE);

	// Read data
	data.resize(dimensions.height * dimensions.width);
	file.read(reinterpret_cast<char*>(data.data()), data.size());

	file.close();
}

4、代码测试

既然二进制文件写入、二进制文件读取都准备好了,那么下面就可以开始测试了。首先,我们准备高度信息和宽度信息3、4,接下来准备数据,并且将这些数据保存到bin文件当中去。保存完了,回头再用read_binary_file读取出来,如果所有的文件信息都一致,那代表没什么问题,反之就要回头检查一下原因了。当然,这里保存的数据可以是灰度图,还可以是彩色图,这个根据需求灵活进行处理,代码改起来也是很方便的。

复制代码
// file starts here
int main() 
{
	// Initialize Winsock
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		std::cerr << "WSAStartup failed." << std::endl;
		return 1;
	}

	const std::string filename = "binary_file.bin";
	Dimensions dimensions = { 3, 4 };
	std::vector<uint8_t> data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

	// Write to binary file
	write_binary_file(filename, dimensions, data);

	// Read from binary file
	Dimensions read_dimensions;
	std::vector<uint8_t> read_data;
	read_binary_file(filename, read_dimensions, read_data);

	std::cout << "Read length: " << read_dimensions.height << std::endl;
	std::cout << "Read width: " << read_dimensions.width << std::endl;
	std::cout << "Read data: ";

	for (const auto& value : read_data)
	{
		std::cout << static_cast<int>(value) << " ";
	}
	std::cout << std::endl;

	// Cleanup Winsock
	WSACleanup();

	return 0;
}
相关推荐
ForDreamMusk7 小时前
高级优化器
人工智能·深度学习
Land03297 小时前
AI网页元素变化无法自动修复?自带元素自愈的自动化解决方案
运维·人工智能·ai·自动化·rpa
Kobebryant-Manba7 小时前
Bert预训练代码
人工智能·深度学习·bert
在水一缸7 小时前
深度解析 Grok 4.5:当推理模型遇上大规模工程实践
人工智能·深度学习·大模型·工程实践·推理模型·混合专家架构·grok 4.5
云智慧AIOps社区8 小时前
2026 国产化 ITSM 替代指南:横向测评 ServiceNow、轻帆云、Jira等五款主流IT服务管理平台
运维·人工智能·运维开发·it服务管理·itsm平台
学习日记5258 小时前
【提示词工程系统教程 05】上下文工程:静态指令、动态检索与RAG架构
人工智能·prompt
腻害兔8 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程
2301_768103498 小时前
HarmonyOS趣味相机实战第24篇:前摄镜像、旋转补偿与识别框坐标统一
图像处理·harmonyos·arkts·camerakit·坐标映射
小羊Yveesss8 小时前
模板建站哪个平台好?模板数量之外还要比较编辑与SEO能力
大数据·人工智能·小程序
程序员-李俞8 小时前
向量引擎接入 SQL 问答沙箱前:只读权限、Base URL 和费用封顶怎么验收
人工智能·大模型·接口测试·api中转·ai api