【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
需要注意的是:(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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
三、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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
需要注意的是:CxImage读取图像数据后图像的原点是在图像的左下角,与我们的传统的图像数据原点为左上角相反,所以在读取图像时”(height-j-1)”的由来。
总结:
不同的实际情况中可能需要用到不同的图像库和对应的函数接口,因此经常需要用到这些不同的库的图像对象之间的数据的转换,实际根据情况进行下缓缓即可。
【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换的更多相关文章
- OpenCV中Mat与二维数组之间的转换
---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
- 利用图像二维熵实现视频信号丢失检测(Signal Loss Detection)
1 图像二维熵 图像二维熵作为一种特征评价尺度能够反映出整个图像所含平均信息量的高低,熵值(H)越大则代表图像所包含的信息越多,反之熵值(H)越小,则图像包含的信息越少.对于图像信息量,可以简单地认为 ...
- 基于图像二维熵的视频信号丢失检测(Signal Loss Detection)
1 图像二维熵 图像二维熵作为一种特征评价尺度能够反映出整个图像所含平均信息量的高低,熵值(H)越大则代表图像所包含的信息越多,反之熵值(H)越小,则图像包含的信息越少.对于图像信息量,可以简单地认 ...
- opencv中mat类介绍
The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It ...
- OpenCV中Mat的基本用法:创建、复制
OpenCV中Mat的基本用法:创建.复制 一.Mat类的创建: 1.方法一: 通过读入一张图像,直接将其转换成Mat对象. Mat image = imread("test.jpg&quo ...
- 基于Opencv识别,矫正二维码(C++)
参考链接 [ 基于opencv 识别.定位二维码 (c++版) ](https://www.cnblogs.com/yuanchenhui/p/opencv_qr.html) OpenCV4.0.0二 ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- OpenCV中Mat的列向量归一化
OpenCV中Mat的列向量归一化 http://blog.csdn.net/shaoxiaohu1/article/details/8287528 OpenCV中Mat的列向量归一化 标签: Ope ...
随机推荐
- CentOS6.9下手动编译并安装Python3.7.0
CentOS6.9默认安装的python版本为2.6.6,若想安装python3以上版本,只能手工编译安装 下面介绍Python-3.7.0版本的手动编译并安装的步骤 1.下载Python-3.7.0 ...
- luoguP1120小木棍(POJ - 1011 )
题意: 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50,个数不超过65. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段 ...
- Refactoring open source business models
https://opensource.com/business/16/4/refactoring-open-source-business-models They say you never forg ...
- janusgraph-mgmt中的一些操作
关闭事务 mgmt = graph.openManagement(); ids = mgmt.getOpenInstances(); for(String id : ids){if(!id.conta ...
- 吉首大学2019年程序设计竞赛(重现赛)D - 数列求和(嘤雄难度)
链接:https://ac.nowcoder.com/acm/contest/992/D $a_{i}=\dfrac {3a_{i-1}-a_{i-2}}{2}+i+1$ 移项再化一下 $a_{i}- ...
- 简述Python的深浅拷贝以及应用场景?
浅拷贝:copy.copy 深拷贝:copy.deepcopy 浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层 主要应用在字符串,数字的 ...
- L1434滑雪
一,看题 1,这个长度怎么算的. 从它自己数,可以走下去的位置. 2,这个题的衣服怎么披上去呀. 3,搜索目标,状态. 肯定要用坐标,不然怎么搜索. 4,在前期还是多写把. 5,我靠这个点还是随机的& ...
- asp.net大附件上传,支持断点续传
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 ...
- BootstrapTable 表格插件
BootStrap Table 下载:https://v3.bootcss.com/getting-started/ BootStrap Table Css:https://v3.bootcss.co ...
- 最近在弄ionic3的时候遇到的一些问题(遇到就更新)
问题一(install提示errno -4048 和管理员权限) npm install npm ERR! code EPERM npm ERR! errno - npm ERR! syscall u ...