在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像。本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系。

一、OpenCV的Mat类到图像二值指针的转换

以下为函数代码:

unsigned char** MatTopImgData(Mat img)
{//获取图像参数int row = img.rows;int col = img.cols; int band = img.channels; //定义图像二值指针 unsigned char** pImgdata = new unsigned char*[band]; for(int i=0;i<band;i++) pImgdata[i] = new unsigned char[row*col]; for(int i=0;i<row;i++) //行数--高度 { unsigned char* data = img.ptr<unsigned char>(i); //指向第i行的数据 for(int j=0;j<col;j++) //列数 -- 宽度 { for(int m=0;m<band;m++) //将各个波段的数据存入数组 pImgdata[m][i*col+j] = data[j*band+m]; } } return pImgdata; }

需要注意的是:(1)在Mat类中,图像数据的存储方式是BGR形式,这样得到的二维指针的数据存储顺序则为BGR形式。(2)在Mat类中图像无论是灰度图还是RGB图都是以以为指针的形式存储的,所以在读取每个数据时,先找到每行数据的首地址,再顺序读取每行数据的BGR的灰度值。(3)在Mat类中的row为行数,对应平时所说的图像的高度,col为列数对用图像的宽度。

二、图像二值指针到OpenCV的Mat类的转换

以下为函数代码:

Mat ImgData(unsigned char** pImgdata, int width, int height, int band) { Mat Img; if(band == 1) //灰度图 Img.create(height, width, CV_8UC1); else //彩色图 Img.create(height, width, CV_8UC3); for(int i=0;i<height;i++) //行数--高度 { unsigned char* data = Img.ptr<unsigned char>(i); //指向第i行的数据 for(int j=0;j<width;j++) //列数 -- 宽度 { for(int m=0;m<band;m++) //将各个波段的数据存入数组 data[j*band+m]=pImgdata[m][i*width+j]; } } return Img; }

三、CxImage类到图像二维指针的转换

以下为函数代码:

unsigned char** CxImageToPimgdata(CxImage Image)
{int width = Image.GetWidth();int height = Image.GetHeight();RGBQUAD rgbdata;unsigned char** pImgdata = new unsigned char*[3]; for(int m=0;m<3;m++) pImgdata[m] = new unsigned char[width*height]; for(int i = 0; i < width; i++) { for(int j = 0; j < height; j++) { //获取主窗口图片每一个像素的rgb数据 rgbdata = Image.GetPixelColor(i, (height-j-1), true); pImgdata[0][j*width + i] = rgbdata.rgbRed; pImgdata[1][j*width + i] = rgbdata.rgbGreen; pImgdata[2][j*width + i] = rgbdata.rgbBlue; } } return pImgdata; }

需要注意的是:CxImage读取图像数据后图像的原点是在图像的左下角,与我们的传统的图像数据原点为左上角相反,所以在读取图像时”(height-j-1)”的由来。

总结:

不同的实际情况中可能需要用到不同的图像库和对应的函数接口,因此经常需要用到这些不同的库的图像对象之间的数据的转换,实际根据情况进行下缓缓即可。

转载于:https://www.cnblogs.com/begoogatprogram/p/6971474.html

OpenCV中Mat,图像二维指针和CxImage类的转换相关推荐

  1. OpenCV中图像Mat,二维指针和CxImage类之间的转换

    在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  2. 彻底解决显示Opencv中Mat图像到Mfc窗口问题

    第一步,转换格式前预先获得待显示控件的大小,若相等则不做处理,若不等则首先改变Mat图像大小,再进行转换. CRect rect;         GetDlgItem(IDC_STATIC_SRC) ...

  3. java中控制台输入二维数组(Scanner类总结)

    由于牛客和LeetCode上的题目不用自己写输入,但实际笔试中都需要从输入开始写,遇到需要从控制台输入二维数组的情况,故对java中的Scanner类作整理和总结. 通过 Scanner 类能获取用户 ...

  4. openCV图像矩阵Mat和二维数组的互相转换

    openCV图像矩阵Mat和二维数组的互相转换 在openCV的应用中,我们获取图像的矩阵信息很简单.但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算.那么我们就需要把openCV读取 ...

  5. opencv获取mat的指针_数字图像处理之opencv中Mat数据操作

    数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...

  6. 【OpenCV 例程200篇】54. OpenCV 实现图像二维卷积

    [OpenCV 例程200篇]54. OpenCV 实现图像二维卷积 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  7. 【OpenCV 例程200篇】53. Scipy 实现图像二维卷积

    [OpenCV 例程200篇]53. Scipy 实现图像二维卷积 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 滤 ...

  8. C++中给二维指针分配内存

          我们都知道在 C++ 中分配动态数组用的是 new , 撤销动态数组用的是 delete[ ] ,现在让我们来看看怎么利用这两个关键字给二维指针分配内存.       原理就不写在这里了, ...

  9. 【Android FFMPEG 开发】FFMPEG 方法中指针类型参数说明 ( 一维指针类型参数 | 二维指针类型参数 )

    文章目录 I . 一维指针类型参数 II . 二维指针类型参数 I . 一维指针类型参数 1 . 音视频流数据包获取 : //读取数据包AVPacket *avPacket = av_packet_a ...

最新文章

  1. 2014 北京邀请赛ABDHJ题解
  2. AXI4-Lite协议详解
  3. matlab在统计学中的简单应用
  4. echarts 多次通过setOption改变图形数据时 数据有时不进行变化
  5. NLP深度学习:近期趋势概述(一)
  6. UCF 大牛 Prof. Shah 课题组代码合集
  7. Nginx学习总结(11)——提高Nginx服务器的安全性,稳定性和性能的12种技巧
  8. JDK1.5英文版CHM文档下载地址
  9. sklearn机器学习之特征工程
  10. spring+mybatis 事务管理,配置都正确,但是回滚不了
  11. 使用VC做一个简单的UI界面对话框
  12. java 反射 接口_Java 怎么通过反射获取并实现这个类里面的接口,并且实现接口中的方法...
  13. Intel IPP密码库 IPPCP 2018——第一部分 基础开发指南
  14. php搭建可道云,腾讯云+kodexplorer可道云搭建私有云盘
  15. java设置列宽_java用POI设置Excel的列宽
  16. MatLab msgbox用法
  17. 程序员六大不良习惯 看看你有啥职业毛病 ~
  18. js代码优化8个优点
  19. 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD
  20. 负载均衡负载场景和解决方案

热门文章

  1. android卸载弹出窗口,卸载Android app弹出浏览器的一种实现
  2. java漂亮的模板设计代码_JAVA模板方法设计模式——Java设计模式,写漂亮的代码——...
  3. 使用Julia进行图像处理--JuliaImages介绍与基础使用
  4. java stack 实现_Swift Stack实现
  5. 组合与继承c++_组合与继承
  6. python gc_Python垃圾收集(Python GC)
  7. proguard 反编译_Android Studio项目结构,编译器,ProGuard
  8. python 命令行 参数_Python命令行参数
  9. 洞悉物联网发展1000问之可穿戴设备的未来会怎样?
  10. 两男子骑摩托车抢夺宴席礼金 警方:嫌疑人已被抓获