FILE* file实际项目操作

遇到一个三维的二进制文件,通过FILE指针进行IO操作,并存入三维Mat中,通过二维Mat进行分层显示

一、打开文件

fopen_s(&file, "XXX.uint16_scv", "rb",通过file文件指针打开XXX.uint16_scv文件,rb以二进制可读的形式
fopen_s:打开文件成功返回0,失败返回非0。

FILE* file;
if (fopen_s(&file, "XXX.uint16_scv", "rb") != 0)
{std::cerr << "Error opening file: " << std::endl;return false;
}
else
{std::cerr << "Opening file is successful " << std::endl;
}

二、判断FILE是否为空指针

if (file == nullptr)
{std::cerr << "Error opening file, file is nullptr: " << std::endl;return false;
}
else
{std::cerr << "File is no empty,Okk! " << std::endl;
}

三、文件中前1024个字节是注释信息无效,需要通过前1024给字节

int fseek(FILE *stream, long int offset, int whence)
参数一:指向 FILE 对象的指针
参数二:相对 whence 的偏移量,以字节为单位
参数三:开始添加偏移 offset 的位置,其中SEEK_SET为文件开头、SEEK_CUR为文件当前位置、SEEK_END为文件末尾

fseek(file, 1024, SEEK_SET)
SEEK_SET从文件头开始,偏移1024个字节,相当于跳过前1024个字节

fseek:操作成功返回0,失败返回非0。

    // 跳过前1024个字节,如果成功,则该函数返回零,否则返回非零值。if (fseek(file, 1024, SEEK_SET) != 0){std::cerr << "Error seeking file\n";fclose(file);return false;}else{std::cerr << "Now skip 1024 byte is successful " << std::endl;}

四、通过三维mat接收字节流

已知三维数据的各个维度的大小xs、ys和zs
size_t count{ static_cast<size_t>(xs) * static_cast<size_t>(ys) * static_cast<size_t>(zs) }; count为数据的总大小
mat = Mat(3, sizes, CV_16UC1);定义一个三维的mat对象,用于存储数据流信息
fread(mat.data, sizeof(uint16_t), count, file)从file中读取count字符到mat.data中且每个数据信息为uint16_t大小

    int xs{ 1032 }, ys{ 1760 }, zs{ 1213 };size_t count{ static_cast<size_t>(xs) * static_cast<size_t>(ys) * static_cast<size_t>(zs) };const int sizes[3] = { zs, ys, xs };mat = Mat(3, sizes, CV_16UC1);if (fread(mat.data, sizeof(uint16_t), count, file) != count){std::cerr << "Error reading file(fread)" << std::endl;return false;}else{std::cerr << "read file is successful, count is :  " << count << std::endl;}

此时三维的mat已经存放了二进制文件中存放的数据流信息

五、以Y轴为例,计算每层的数据之和

mat.ptr<uint16_t>(z_, y_)[x_]获取三维mat的xyz信息

    unsigned long arr[kys]{};//用于存储Y轴的所有平面数据之和for (int y_ = 0; y_ < ys; y_++)//y{unsigned long value = 0;for (int x_ = 0; x_ < xs; x_++)//x{for (int z_ = 0; z_ < zs; z_++)//z{value += unsigned long(mat.ptr<uint16_t>(z_, y_)[x_]);}}arr[y_] = value;}

六、将指定的Y轴某一层进行赋值给二维Mat

因为这里给到的数据XYZ是相反的,故mat.ptr<uint16_t>(z_,300)[x_]表示Y轴的300位置的切片
*mat1.ptr<uint16_t>(z_, x_) = mat.ptr<uint16_t>(z_,300)[x_] / 255;将这层切片赋值给二维的mat1,记得维度信息得对应且每层的大小也要清楚,Y轴方向切得到的图片大小为Z × X

Mat mat1 = Mat::zeros(zs,xs, CV_8UC1);
std::cout << "mat1.size() is : " << mat1.size() << std::endl;
for (int x_ = 0; x_ < xs; x_++)//x
{for (int z_ = 0; z_ < zs; z_++)//z{*mat1.ptr<uint16_t>(z_, x_) = mat.ptr<uint16_t>(z_,300)[x_] / 255;}
}

七、显示二维Mat

传入mat1对象即可

namedWindow("mat1_y", WINDOW_FREERATIO);
imshow("mat1_y", mat1);

其他维度信息也都类似,因为项目需要,故进行了记录一下,方便后续回顾

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

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

相关文章

【二叉树】非递归实现前中后序遍历

目录 前言 算法思想 非递归实现前序遍历 过程分析 代码 非递归实现中序遍历 过程分析 代码 非递归实现后序遍历 过程分析 代码 前言 1&#xff09;前序&#xff1a;根 左子树 右子树 2&#xff09;中序&#xff1a;左子树 根 右子树 3&#xff09;后序&#xff1…

邮箱调用接口的服务有哪些?怎么配置接口?

邮箱调用接口安全性如何保障&#xff1f;使用邮箱服务器的方法&#xff1f; 邮箱调用接口为各种应用和系统提供了便捷的电子邮件发送与接收功能。选择合适的邮箱调用接口服务可以大大提升工作效率和用户体验。本AokSend将探讨一些主要的邮箱调用接口服务。 邮箱调用接口&…

北大国际医院腹膜后纤维化课题组 多学科协作开辟治疗新径

腹膜后纤维化(Retroperitoneal Fibrosis,简称RPF)是一种罕见的自身免疫性疾病,其核心特征是纤维组织的异常增生与硬化。这种疾病主要影响肾脏下方的腹主动脉和髂动脉区域,增生的纤维组织会逐渐压迫周围的输尿管和下腔静脉,从而导致一系列并发症,包括主动脉瘤、肾功能衰竭等,甚至…

Oracle数据库之锁(十五)

Oracle的锁机制是用于控制对共享资源的并发访问&#xff0c;以确保数据库的一致性和完整性。以下是关于Oracle锁的详细解释&#xff1a; 1. 锁的类型 DML锁&#xff08;Data Locks&#xff09;&#xff1a; 用于控制数据操纵语言&#xff08;如INSERT、UPDATE、DELETE等&…

【图像超分】论文精读:Reflash Dropout in Image Super-Resolution(RDSR)

第一次来请先看这篇文章:【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等) 文章目录 前言Abstract1. Introduction2. Related Work3. Obs…

国内对运筹学的认识

发展时间还不够&#xff0c;很多硬性&#xff08;商业需求&#xff09;软性&#xff08;人力资源&#xff0c;文化&#xff09;的条件还不成熟。先歪个楼。20世纪50年代&#xff0c;美国军方需要优化每个战区配置多少艘航空母舰&#xff0c;当时的线性规划给出的答案可能是某个…

MySQL(进阶)--索引

目录 一.存储引擎 1.MySQL体系结构​编辑 2.存储引擎简介 3.存储引擎特点 (1.InnoDB (2.MyISAM (3.Memory 4.存储引擎选择 二.索引 1.索引概述 2.索引结构 3.索引分类 4.索引语法 (1.创建索引 (2.查看索引 (3.删除索引 5.SQL性能分析 (1.SQL执行频率 (2.慢查…

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言随机查询语…

Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录 1、res/raw 文件夹1.1、特点1.2、使用方法1.3、示例&#xff1a; 2. assets 文件夹2.1、特点2.2、使用方法2.3、示例&#xff1a; 3、使用场景3.1、res/raw 使用场景3.2、assets 使用场景 4、比较与选择5、文件夹选择的建议6、 示例代码总结6.1、res/raw 示例6.2、ass…

电瓶车进电梯识别报警摄像机

随着电动车的普及&#xff0c;越来越多的人选择电动车作为出行工具。在诸多场景中&#xff0c;电梯作为一种常见的交通工具&#xff0c;也受到了电动车用户的青睐。然而&#xff0c;电动车进入电梯时存在一些安全隐患&#xff0c;为了提高电动车进电梯的安全性&#xff0c;可以…

小程序自动化辅助渗透脚本(2024)

简介 1.还在一个个反编译小程序吗&#xff1f; 2.还在自己一个个注入hook吗&#xff1f; 3.还在一个个查看找接口、查找泄露吗&#xff1f; 现在有自动化辅助渗透脚本了&#xff0c;自动化辅助反编译、自动化注入hook、自动化查看泄露 注&#xff1a;本工具仅用于学习交流&…

Java中的JSON神器,如何轻松玩转复杂数据结构

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、揭秘JSON世界的基石 在Java的世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于文本&#xff0c;易于阅读和编写&#xff0c;同时也易于…

站内信设计

参考文章&#xff1a;https://cloud.tencent.com/developer/article/1684449 b站站内信业务设计&#xff1a; 消息的类型分为&#xff1a; 1、系统消息 2、、点赞、回复等用户行为之间的消息(事件提醒) 3、用户之间的消息 系统消息 用一个用户消息表可以吗&#xff1f; 可…

XS2185一款八通道以太网供电控制器

XS2185是一款八通道以太网供电控制器。 XS2185通过侦测各通道的DET管脚输入电压 来判断是否有合格的负载/PD接入系统&#xff0c;以决定 是否开启MOS供电开关。 当通道已经处于供电状态时&#xff0c;XS2185通过侦 测SENSE管脚的输入电压&#xff0c;以判断供电是否发生 …

免费,Python蓝桥杯等级考试真题--第15级(含答案解析和代码)

Python蓝桥杯等级考试真题–第15级 一、 选择题 答案&#xff1a;B 答案&#xff1a;D 解析&#xff1a;集合的并集运算有两种方式&#xff0c;一种是使用“|”运算符进行操作&#xff0c;另一种是使用union()方法来实现&#xff0c;故答案为D。 答案&#xff1a;A 解析&…

Caused by: java.lang.IllegalArgumentException: Unknown flag 0x1000

Dubbo使用Tomcat安装admin2.5.x管理平台时发生的错误: Caused by: java.lang.IllegalArgumentException: Unknown flag 0x1000 解决方法&#xff1a; 将本地的jdk环境变量切换成jdk8即可。

[ C++ ] 类和对象( 下 )

初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟 一个放在括号中的初始值或表达式。 class Date { public: Date(int year, int month, int day): _year(year), _month(month), _d…

视频汇聚/云存储/安防监控EasyCVR接入GB28181设备未回复ack信息的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 用户反馈&#xff0c;设备通过国标GB28181注…

kubeadm引导欧拉系统高可用的K8S1.28.X

文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…

关于高性能滤波器和普通型滤波器的区别说明

高性能滤波器和普通型滤波器在性能和滤波效果上存在显著差异。以三安培为代表分析高性能滤波器和普通型滤波器的区别&#xff1a; 从上图曲线可看出&#xff1a; 1.高性能滤波器和普通型滤波器的滤波范围不同。普通型滤波器有效滤波范围为 150KHz~30MHz&#xff0c;而高性能滤…