CvMat的矩阵结构

 typedef struct CvMat
{
//矩阵中元素的类型
int type;
//行数据长度
int step; /* for internal use only */
int* refcount;
int hdr_refcount; //指向数据的指针
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; #ifdef __cplusplus
//矩阵的行数
union
{
int rows;
int height;
};
//矩阵的列数
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif }
CvMat;

矩阵的type的预定义类型为:CV_<bit_depth>(S|U|F)C(number_of_channels)。所以矩阵的元素可以是32位浮点型数据(CV_32FC1),或者是无符号的8位三元组的整型数据(CV_8UC3),一个CvMat的元素不一定就是个单一的数字,一般更可能是一个向量。

行数据长度step用字节表示而不是整型或者浮点型长度。

但是这个type在对Mat初始化以后,会通过一个宏把它装换成一个数值:

 #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))

下面说一下创建矩阵的方法:

创建一个矩阵方法一:

 /* Allocates and initializes CvMat header and allocates data */
CVAPI(CvMat*) cvCreateMat( int rows, int cols, int type );

指向数据部分的指针有各种类型的,但是他们的起始地址是一样的。

创建矩阵的方法二:

创建CvMat结构体,但是不分配内存

 /* Allocates and initalizes CvMat header */
CVAPI(CvMat*) cvCreateMatHeader( int rows, int cols, int type );

分配数据所需要的内存

 /* Allocates array data */
CVAPI(void) cvCreateData( CvArr* arr );

创建矩阵方法三:

克隆矩阵

 /* Creates an exact copy of the input matrix (except, may be, step value) */
CVAPI(CvMat*) cvCloneMat( const CvMat* mat );

该函数根据现有的矩阵克隆一个新的矩阵,分配独立的内存空间,需要使用单独的cvReleaseMat函数释放内存空间。

创建矩阵方法四:

在已有的CvMat结构体上初始化矩阵,这样的结果是数组和矩阵的数据部分有相同的内存空间。

 /* Initializes CvMat header */
CVAPI(CvMat*) cvInitMatHeader( CvMat* mat, int rows, int cols,
int type, void* data CV_DEFAULT(NULL),
int step CV_DEFAULT(CV_AUTOSTEP) );

注意这个函数的第一个参数,一定要是初始化的结构体,不能只是一个空指针,所以可以这样用:

 CvMat pMat;
float data[] = {,,,}; cvInitMatHeader(&pMat, , , CV_32FC1, data);

但是不可以这样:

 CvMat* pMat;
float data[] = {,,,}; cvInitMatHeader(pMat, , , CV_32FC1, data);

因为pMat是一个没有初始化的指针。

有关CvMat数据内存空间的释放:

上面的着三种方式的数据内存都是开辟在堆内存中的,所以要释放占用的内存。

 /* Releases CvMat header and deallocates matrix data
(reference counting is used for data) */
CVAPI(void) cvReleaseMat( CvMat** mat );

OpenCV学习(3)--Mat矩阵的操作的更多相关文章

  1. OpenCV学习(5) Mat的基本操作(2)

          本章我们学习一下Mat中的常用操作,因为在后面其它的教程中,我们经常要对图像进行各种处理,也要使用这些操作. 一. Mat的复制,就是从一个矩阵A,生成相关的另一个矩阵B. (1)使用赋值 ...

  2. OpenCV学习笔记:矩阵的掩码操作

    矩阵的掩码操作很简单.其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值.掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响.从数学观点看,我们用自己设置的权值,对像素邻 ...

  3. OpenCV学习:Mat结构中的数据共享机制

    使用Mat类,内存管理变得简单,不再像使用IplImage那样需要自己申请和释放内存. Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩 ...

  4. OpenCV学习(4) Mat的基本操作(1)

          图像在OpenCV中都是通过Mat类来存储的,Mat可以用来表示N维矩阵,当然用的最多的还是二维矩阵.       Mat类有两部分组成:第一部分是头信息,这些信息主要用来描述矩阵,比如矩 ...

  5. OpenCV学习笔记——Mat类型数据存储

    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] 比如 CV_8UC3 表示 ...

  6. opencv学习笔记(05)——操作相邻区域

    下面的例子以灰度图像为例: #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp& ...

  7. opencv学习笔记(01)——操作图像的像素

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <ope ...

  8. [OpenCV学习笔记2][Mat数据类型和操作]

    [Mat数据类型和基本操作] ®.运行环境:Linux(RedHat+OpenCV3.0) 1.Mat的作用: Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来保存实数或复数的向量.矩阵 ...

  9. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

随机推荐

  1. OA 权限控制

    对于加入删除 初始化password等操作的权限 控制 第一种方法就是在每一个超链接前加 推断 如 <s:if test="#session.user.hasPrivilegeByNa ...

  2. 找出诡异的Bug:数据怎么存不进去

    带着学生做课程设计.程序一大,课程中做过了小项目,练过了分解动作,一到合起来了,难免还是要乱了分寸.事实上,实战的功夫,就是这样出来的.(课程设计指导视频链接(第36课时,3.18 银行系统开发).课 ...

  3. 任务调度开源框架Quartz动态加入、改动和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包括了调度器监听.作业和触发器监听.你能够配置作业和触发器监听为全局监听或者是特定于 ...

  4. 移动端WEB开发 代码片段

    WebApp是指基于Web的系统和应用,其作用是向广大的最终用户发布一组复杂的内容和功能(不明白说的是什么).其实Web APP就是一个针对Iphone.Android等智能手机优化后的web站点,它 ...

  5. 有用的jQuery布局插件推荐

    网页设计中排版也是很重要的,但有些比较难的网页排版我们可以用一些jQuery来实现,今天文章中主要分享一些有用的jQuery布局插件,有类似Pinterest流布局插件.友荐的滑动提示块以及其它jQu ...

  6. 【泛化物品】【HDU1712】【ACboy needs your help】

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. asp.net 跨页面传值常用方法

    常用方法有以下: 1.queryString 2.form-post控件传递 3.cookie 4.application 5.session querystring: http://website. ...

  8. Knime 使用 初探

    使用数据挖掘工具 Knime,分析某公司用户使用情况. 首先,打开csv文件数据,看到有以下门类: 时间.track id 歌曲名.用户行为.用户id.日期.snap_id 即歌曲门类 然后,打开Kn ...

  9. 解决IP地址被占用问题

    问题背景: 在公司一直有同事在抱怨IP地址总是被占用的问题,我决定用技术解决这个问题 解决方案: 1 最开始想在防火墙里面做IP和mac地址绑定,做了几个之后,还是有同事在说IP被占用,后来 分析了一 ...

  10. Swift语法基础入门四(构造函数, 懒加载)

    Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...