前言

  本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法。

  更多的矩阵处理函数还请参阅相关资料。

CvMat 的类型定义

 typedef struct CvMat
{
int type; // 数据类型
int step; // 行长度
int* refcount; /* 内部使用 */
int hdr_refcount; /* 内部使用 */
union // 指向数据区的指针
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
union // 行数
{
int rows;
int height;
};
union // 列数
{
int cols;
int width;
};
} CvMat;

CvMat 的创建方法

  创建矩阵函数:

 cvMat * cvCreateMat (int rows, int cols, int type);

  rows:行数

  cols:列数

  type:数据类型,其格式一般为 CV_<比特数>(S|U|F)C<通道数>,比如 CV_32FC3 就表示 32 位浮点类型的 3 通道矩阵。

CvMat 中单个元素的存取方法

  1. 可以使用宏 CV_MAT_ELEM () 来实现对矩阵某个元素的读取,如下代码访问矩阵中的第 3 行 2 列的元素:

 float elem_3_2 = CV_MAT_ELEM (*mat, float, , );

  其中,mat是 CvMat * 类型,float 是类型说明,最后两个参数是元素的行和列,该宏返回指定的元素的值。

  2. 可以使用宏 CV_MAT_ELEM_PTR () 来实现对矩阵某个元素的设置,该宏返回指向指定元素的指针,如下代码修改矩阵中的第 3 行 2 列的元素:

 *((float *)CV_MAT_ELEM_PTR (*mat, , )) = elem_3_2;

  需要说明的是,获取到指向指定元素的指针后,还需要对这个指针进行强制转型方能正常使用。

CvMat 的遍历方法

  如果遍历采用一个个取元素的方法,未免效率太慢。实际应用中,对矩阵的遍历常常采用指针遍历法,如下代码展示了对一个 CvMat 矩阵的遍历:

 // 此头文件包含图像IO函数的声明
#include "highgui.h"
// 此头文件包含基本的图像处理函数和高级计算机视觉算法
#include "cv.h"
#include <iostream> #define R 10 // 矩阵行
#define C 10 // 矩阵列 using namespace std; int main (void) { // 创建 R 行 C 列 32位单通道浮点类型的矩阵
CvMat *m1 = cvCreateMat ( R, C, CV_32FC1 ); // 赋值变量
float s = 1.0f;
// 遍历矩阵并赋值
for (int i=; i<R; i++) {
// 获取矩阵每行的行首地址,下面的data成员必须先取其ptr成员计算完偏移地址后,再强制转化为目标数据类型。
float *ptr = (float *)(m1->data.ptr + i * m1->step);
// 遍历子一维数组
for (int j=; j<C; j++) {
ptr[j] = s++;
}
} // 打印结果
for (int i=; i<m1->rows; i++) {
float *ptr = (float *)(m1->data.ptr + i * m1->step);
for (int j=; j<m1->cols; j++) {
printf("%7.2f", *ptr);
ptr++;
}
cout << endl;
}
cout << endl << endl; getchar(); return ;
}

  运行结果:

  

 说明

  1. 一般尽量创建浮点矩阵( F 型 ),别的类型值可以向上转型后存放进去。

  2. 如果要遍历的是字符型( U S 型 )矩阵,那么遍历指针一定要设定为字符型的,等到取出的时候再向上转型/存进的时候向下转型即可。

OpenCV 中的三大数据类型:CvMat 类型的更多相关文章

  1. OpenCV 中的三大数据类型:IplImage 类型

    前言 本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧. 更多的矩阵处理函数还请参阅相关资料. IplImage 的类型定义 typedef struct _IplIm ...

  2. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  3. OpenCV 中的三大数据类型( 概述 )

    前言 OpenCV 提供了许多封装好了的类型,而其中,以三大类型最为核心.本文将大致介绍这三大类型. CvArr:不确定数组 它可以被视为一个抽象基类,后面的两大类型都继承此类型并扩展.只要某个函数的 ...

  4. OpenCV中的矩阵和图像类型

    任务刚刚做完,就迫不及待的来写写在OpenCV中常见的几类数据类型: 在使用OpenCV时我们时常会碰到IplImage这个数据类型,IplImage就是我们通常说的“图像”进行编码的基本结构,这些图 ...

  5. opencv中Mat类型数据操作与遍历

    Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...

  6. OpenCV(三) 之 基本数据结构 CvMat和 IplImage

    OpenCV(三) 之 基本数据结构 CvMat和 IplImage CvMat IplImage OpenCv中基本的数据类型 类型 参数 表示 CvPoint int x,y 像素点 CvPoin ...

  7. OpenCV 中 IplImage、CvMat、Mat中的type是怎么回事?

    在使用opencv的过程中,无论使用原始的IplImage和CvMat类型,还是用最新C++版本的Mat类型,在创建和使用过程中,经常会遇到CV_8UC1.CV_8UC3.CV_32FC3等声明,我以 ...

  8. OpenCV中MAT中数据类型的设置(转)

    前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...

  9. OpenCV中IplImage/CvMat/Mat转化关系

    原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...

随机推荐

  1. MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法

    项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决. ...

  2. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---5

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...

  3. 四、Ubuntu 一些常用命令

    1.锁定root用户 :sudo passwd -l root 2.解锁root用户 :sudo passwd -u root 3.切换身份:su root  或者  su 其他用户名,然后输入密码, ...

  4. DB2 数据库中字段特定字符替换为空

    Update RM_CarInfo set ImportTitle = Replace(ImportTitle,'ZD','') WHERE ImportTitle LIKE'%ZD%';

  5. HDU 1020 Encoding【连续的计数器重置】

    Encoding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  6. HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  7. 搭建 Maven ---基础入门

    这篇随笔从最基础的控制台  搭建maven讲,后面再升入的讲解IDEA搭建Maven. 一,Maven是什么?作用是什么? Maven是一个项目管理工具,它包含了一个项目对象模型 (Project O ...

  8. BZOJ 1188 [HNOI2007]分裂游戏

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1188 学习SG函数的过程中,我先看了一篇叫做 <2008-贾志豪-组合数学略述... ...

  9. 【ActiveMQ】管理界面查看消息详情,报错/WEB-INF/tags/form/forEachMapEntry.tag PWC6199: Generated servlet error: The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files

    ActiveMQ版本:5.12 JDK版本:1.8 ===================== 使用ActiveMQ过程中,在管理界面查看消息详情,发现报错: 查看日志信息,报错如下: 2017-11 ...

  10. mac下安装好sencha cmd后每次都需要输入source ~/.bash_profile

    解决办法: 在终端输入vim ~/.zshrc加一句 source ~/.bash_profile