OpenCV 中的三大数据类型:CvMat 类型
前言
本文将介绍 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 类型的更多相关文章
- OpenCV 中的三大数据类型:IplImage 类型
前言 本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧. 更多的矩阵处理函数还请参阅相关资料. IplImage 的类型定义 typedef struct _IplIm ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- OpenCV 中的三大数据类型( 概述 )
前言 OpenCV 提供了许多封装好了的类型,而其中,以三大类型最为核心.本文将大致介绍这三大类型. CvArr:不确定数组 它可以被视为一个抽象基类,后面的两大类型都继承此类型并扩展.只要某个函数的 ...
- OpenCV中的矩阵和图像类型
任务刚刚做完,就迫不及待的来写写在OpenCV中常见的几类数据类型: 在使用OpenCV时我们时常会碰到IplImage这个数据类型,IplImage就是我们通常说的“图像”进行编码的基本结构,这些图 ...
- opencv中Mat类型数据操作与遍历
Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...
- OpenCV(三) 之 基本数据结构 CvMat和 IplImage
OpenCV(三) 之 基本数据结构 CvMat和 IplImage CvMat IplImage OpenCv中基本的数据类型 类型 参数 表示 CvPoint int x,y 像素点 CvPoin ...
- OpenCV 中 IplImage、CvMat、Mat中的type是怎么回事?
在使用opencv的过程中,无论使用原始的IplImage和CvMat类型,还是用最新C++版本的Mat类型,在创建和使用过程中,经常会遇到CV_8UC1.CV_8UC3.CV_32FC3等声明,我以 ...
- OpenCV中MAT中数据类型的设置(转)
前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...
- OpenCV中IplImage/CvMat/Mat转化关系
原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...
随机推荐
- bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基
题目链接 题意 给定\(n\)个数,将其所有的子集(\(2^n\)个)的异或和按升序排列.给出一个询问\(q\),问\(q\)在该序列中第一次出现位置的下标(下标从\(1\)开始). 题解 结论 记其 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---22
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 修复Kaos的中文显示
前段时间为了尝鲜KDE5,于是安装了Kaos 2015.2,默认的kde5桌面,速度也不错,软件更新很及时,计划淘汰掉chakra算了,一直中文在终端下显示为乱码,经网上搜索整理记录如下: (1)使用 ...
- Day 32 process&threading_4
线程和进程 4 一.multiprocessing模块 multiprocessing包是Python中的多进程管理包. 与threading.Thread类似,它可以利用multiprocessin ...
- hdu 4994(博弈)
Revenge of Nim Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu3715 2-sat+二分
Go Deeper 题意:确定一个0/1数组(size:n)使得满足最多的条件数.条件在数组a,b,c给出. 吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话).以后做二sat:有哪些 ...
- OSX 系统无法直接用 Chrome 双击点击打开本地 html 文件
在 Mac OS X 下,文件经常会被附加上 OS X 特有的扩展属性 ( extend attributes ),具体表现是用 ls -l 查看时会有 @ 的标记,譬如: $ ls -l index ...
- poj 3140 Contestants Division [DFS]
题意:一棵树每个结点上都有值,现删掉一条边,使得到的两棵树上的数值和差值最小. 思路:这个题我直接dfs做的,不知道树状dp是什么思路..一开始看到数据规模有些后怕,后来想到long long 可以达 ...
- [HAOI2011]Problem b&&[POI2007]Zap
题目大意: $q(q\leq50000)$组询问,对于给定的$a,b,c,d(a,b,c,d\leq50000)$,求$\displaystyle\sum_{i=a}^b\sum_{j=c}^d[\g ...
- 【转】浅谈多核CPU、多线程、多进程
浅谈多核CPU.多线程.多进程 1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核3 ...