使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出

2024-03-07 15:38

本文主要是介绍使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/bendanban/article/details/30306505

在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把数据写到文件里,用matlab读出来,然后用matlab各种高级功能查看数据的值。


1、将Mat的数据写入指定文件

为了方便拿来主义者,我直接把这个函数贴出来,你只要把代码拷贝到自己的代码里,就可以直接用了。如果有问题,赶紧评论,我会尽快看看问题出在哪里

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <string>  
  4. #include <opencv2/opencv.hpp>  
  5. using namespace std;  
  6. using namespace cv;  
  7.   
  8. int abWrite(const Mat &im, const string &fname)  
  9. {  
  10.   ofstream ouF;  
  11.   ouF.open(fname.c_str(), std::ofstream::binary);  
  12.   if (!ouF)  
  13.   {  
  14.     cerr << "failed to open the file : " << fname << endl;  
  15.     return 0;  
  16.   }  
  17.   for (int r = 0; r < im.rows; r++)  
  18.   {  
  19.     ouF.write(reinterpret_cast<const char*>(im.ptr(r)), im.cols*im.elemSize());  
  20.   }  
  21.   ouF.close();  
  22.   return 1;  
  23. }  

2、用matlab读出二进制文件中的数据

在用matlab来读数据的时候,你必须知道Mat的宽度,高度,通道数,单个通道元素的类型

以三通道,UCHAR为例,读取数据,显示数据。


C++程序,用于调用abWrite函数。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Mat orgIm = imread("im.jpeg");  
  2. abWrite(orgIm, "./orgIm_8UC3.dat");  

Matlab程序,读出orgIm_8UC3.dat的数据,并调整为RGB数据显示。

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. width  = 321; % 这个地方你要指定为你自己的矩阵的宽度  
  2. height = 481; % 这里也要指定为你自己的矩阵的高度  
  3. channels = 3; % 通道数  
  4. fs = fopen('orgIm_8UC3.dat', 'rb');  
  5. db = fread(fs, 'uint8'); % 注意,这里用的是unsigned int8  
  6. fclose(fs);  
  7.   
  8. ou = reshape(db, channels*height, width); % 调整显示格式  
  9.   
  10. im(:,:,1) = ou(3:3:end, :)'; % R通道  
  11. im(:,:,2) = ou(2:3:end, :)'; % G通道  
  12. im(:,:,3) = ou(1:3:end, :)'; % B通道  
  13. figure; imshow(uint8(im)) % 一定要记得转换为uint8  


我的用的测试图像:



执行matlab后的显示图像:



这个实验说明,abWrite很大可能是没有问题的,如果你愿意测试,赶紧写个代码测试下吧。测试有问题,欢迎评论,我会尽快解决。


这篇关于使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784005

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —