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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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 formatuint32_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 datafile.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 formatuint32_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 datadata.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 WinsockWSADATA 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 filewrite_binary_file(filename, dimensions, data);// Read from binary fileDimensions 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 WinsockWSACleanup();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeFuse成功支持通义千问算法大赛,评测方案已开源

前段时间&#xff0c; 首届通义千问AI挑战赛成功举办&#xff0c;CodeFuse 为大赛提供技术支持&#xff0c;模型微调框架 MFTCoder 和 CodeFuseEval 评测框架为大赛保驾护航&#xff0c;助力大赛圆满完成。我们基于leetcode 阿里和蚂蚁最新面试题库建设了“模型赛马”在线打榜的…

HTML入门

学习视频 初识HTML 什么是HTML HTML&#xff1a;Hyper Text Markup Language&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画等 HTML 5&#xff0c;提供了一些新的元素和一些有趣的新特性&#xff0c;同时也建立了一些新规则。…

从传统到智慧:文旅产业的数字化变革

随着科技的迅猛发展和数字化时代的到来&#xff0c;文旅产业正经历着一场前所未有的变革。传统的旅游模式和服务方式逐渐被智慧化的技术和应用所取代&#xff0c;为游客带来更加便捷、高效、个性化的体验。本文将探讨文旅产业如何从传统模式向智慧化转型&#xff0c;以及数字化…

springboot 集成 nacos (demo 版)

环境要求&#xff1a;本地安装 nacos&#xff08;windows版本&#xff09;&#xff0c;jdk 是 8&#xff0c;安装完还得在 nacos 上面配置一个 yaml 类型的配置文件&#xff0c;方便项目演示读取。 提示&#xff1a;如标题所示&#xff0c;本文只介绍如何从零到一的去集成 naco…

基于Java SSM框架实现智能快递分拣系统项目【项目源码】

基于java的SSM框架实现智能快递分拣系统演示 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serv…

xss 盲打使用

使用beef等内网xss平台&#xff0c;或外网xss平台&#xff08;XSS平台-仅用于xss安全测试专用、XSS平台 - &#xff08;支持http/https&#xff09;XSS Platform&#xff09; 将生成的js脚本写到网站的留言框处&#xff0c;但对应的用户(尤其是admin)查看留言&#xff0c;就会…

【Vue.js设计与实现】第一篇:框架设计概览-阅读笔记(完结)

从高层设计的角度去探讨框架需要关注的问题。 参考&#xff1a;速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.…

Vue-51、Vue技术github案例(发送ajax)

1、在index引入bootstrap.csss (注意第三方css库最好在indxe里面引入) 2、List.vue源码 <template><div class"row"><div v-show"users.length" class"card" v-for"p in users" :key"p.login"><a :hr…

Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框

一、前言 近期收到一个用户需求&#xff0c;要求音视频组件能够切换声卡&#xff0c;首先要在vlc上实现&#xff0c;于是马不停蹄的研究起来&#xff0c;马上查阅对应vlc有没有自带的api接口&#xff0c;查看接口前&#xff0c;先打开vlc播放器&#xff0c;看下能不能切换&…

一条select在mysql中的执行过程

查询缓存&#xff1a; 一个select语句&#xff0c;会先到查询缓存中看看&#xff0c;若是以前执行过&#xff0c;直接将查询结果返回给客户端&#xff0c;若是查询缓存没有命中&#xff0c;就需要执行后面的计划 分析器 如果没有命中查询缓存&#xff0c;就要开始分析器了&am…

第八篇:node模版引擎Handlebars及他的高级用法(动态参数)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 引言&#xff1a; &#x1f…

【VSCode 光标返回上一位置】

默认按键 Windows: Alt ← ;或者 鼠标侧键 Linux: Ctrl Alt - ;貌似数字键盘的减号没效果 Mac: Ctrl - 自定义修改方法&#xff1a; VSCode左下角 “管理 / Manage” “键盘快捷方式 / KeyBoard Shortcuts” 搜索 “前进 / Go Forward 或 后退 / Go Back” 双击需…

HarmonyOS4.0系统性深入开发33相对布局(RelativeContainer)

相对布局&#xff08;RelativeContainer&#xff09; 概述 RelativeContainer为采用相对布局的容器&#xff0c;支持容器内部的子元素设置相对位置关系。子元素支持指定兄弟元素作为锚点&#xff0c;也支持指定父容器作为锚点&#xff0c;基于锚点做相对位置布局。下图是一个…

【python基础】爬虫练习

不知道大家有没有通过豆瓣网寻找一些排名较高的电影&#xff0c;反正小编基本上是顺着排名一点点找电影看。 本文将详细介绍如何使用Python爬虫抓取豆瓣网电影评论用户的观影习惯数据&#xff0c;并进行简单的数据处理和分析。 目录 一、配置环境1.1、 安装Python1.2、 安装Re…

『C++成长记』string使用指南

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 &#x1f4d2;2.1string类对象的常…

Sg7050ccn晶体振荡器spxo规格书

SG7050CCN是一款CMOS输出石英晶体振荡器&#xff0c;小体积尺寸7.0x5.0mm,四脚贴片&#xff0c;额定频率2.5MHz ~ 50MHz&#xff0c;电源电压4.5V至5.5V,工作温度范围B : -20 C to 70 C / G : -40 C to 85 C C&#xff0c;具有小体积轻薄型&#xff0c;低抖动&#xff0c;低功耗…

Unity打包Android,jar文件无法解析的问题

Unity打包Android&#xff0c;jar无法解析的问题 介绍解决方案总结 介绍 最近在接入语音的SDK时&#xff0c;发现的这个问题. 当我默认导入这个插件的时候&#xff0c;插件内部的文件夹&#xff08;我下面话红框的文件夹&#xff09;名字原本为GCloudVoice&#xff0c;这时候我…

vit细粒度图像分类(八)SIM-Trans学习笔记

1.摘要 细粒度视觉分类(FGVC)旨在从相似的从属类别中识别物体&#xff0c;这对人类准确的自动识别需求具有挑战性和实用性。大多数FGVC方法侧重于判别区域挖掘的注意机制研究&#xff0c;而忽略了它们之间的相互依赖关系和组成的整体对象结构&#xff0c;而这些对模型的判别信…

解锁文档处理的全新维度:ONLYOFFICE 文档开发者版

前言 相信大家对于 ONLYOFFICE 这款办公软件可能已经有所耳闻&#xff0c;最近因工作需要&#xff0c;我在众多办公协作工具中选择了 ONLYOFFICE&#xff0c;原因主要是它开源经济实惠&#xff0c;可以部署在自己的服务器上并且能够轻松集成到我们的平台中。在数字化信息时代&…

torch与cuda\cudnn和torchvision的对应

以上图片来源于这篇博客 于是&#xff0c;我需要手动下载0.9.0torchvision 直接在网站https://pypi.tuna.tsinghua.edu.cn/simple/后面加上torchvision&#xff0c;就不用ctrlF搜torchvision了&#xff0c;即进入下面这个网站&#xff0c;找到对应版本的包下载安装即可 https…