【视频开发】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 ...
随机推荐
- el-table 多列显示隐藏造成内容错乱
- 《逆袭团队》第九次团队作业【Beta】Scrum meeting 2
项目 内容 软件工程 任课教师博客主页链接 作业链接地址 团队作业9:Beta冲刺与团队项目验收 团队名称 逆袭团队 具体目标 (1)掌握软件黑盒测试技术:(2)学会编制软件项目总结PPT.项目验收报 ...
- easyui 自己写的一些小东西
1设置combobox,当我们只需要显示一个commbobox的时候,并且默认选择第一项 function Getcombobox(comboId, value, groupNo) { $('#' + ...
- 11 open source business models
https://www.zdnet.com/article/11-open-source-business-models/ Critics are always claiming open sourc ...
- 10-Flutter移动电商实战-使用FlutterSwiper制作轮播效果
1.引入flutter_swiper插件 flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配. 好牛X得介绍,一般敢用“最”的一般都是神级大神,看到这个介绍 ...
- [PA2012]Dwa torty
[PA2012]Dwa torty 题目大意: 给定两个排列\(A_{1\sim n},B_{1\sim n}\),你需要将两个排列用最少的次数消除. 消除只能从头消除,一次消除可以从两个排列的头部取 ...
- 关于SpringCloud、SpringBoot简单讲解
什么是Spring Boot 用我的话来理解,Spring Boot就是整合了框架的框架,它让一切依赖都变得有序简单,你不用操心A.jar是什么版本,又依赖哪些版本的jar,它默认配置了很多框架的使 ...
- python-使用阿里云镜像加速
1. 在当前用户根目录下建立.pip文件夹 mkdir ~/.pip2.在.pip文件夹下创建文件pip.conf,并追加内容 [global]trusted-host=mirrors.aliyun. ...
- java中JSON转含泛型对象
public static void main(String[] args) { UserDto userDto=new UserDto("test","14" ...
- Calcite分析 - RelTrait
RelTrait 表示RelNode的物理属性 由RelTraitDef代表RelTrait的类型 /** * RelTrait represents the manifestation of a r ...