一.基本数据类型:

1.CvPoint

图像中的点

Opevcv提供的数据类型中最简单的就是CvPoint.

typedef struct CvPoint

{

int x;

int y;

}

CvPoint

CvPoint包含int x 和int y两个数据成员,它的变体有CvPoint2D32f 和 CvPoint3D32f.

CvPoint2D32f包含float x , float y两个数据成员.

二维空间中的点

typedef struct CvPoint2D32f

{

float x;

float y;

}

CvPoint2D32f

CvPoint3D32f 包含float x , float y , float z 三个数据成员.

三维空间中的点

typedef struct CvPoint3D32f

{

float x;

float y;

float z;

}

CvPoint3D32f

2. CvSize

CvSize的数据成员是: int width , int height.

图像的尺寸

typedef struct CvSize

{

int width;

int height;

}

CvSize;

对应的浮点类型的数据成员 , CvSize的变体: CvSize2D32f.

typedef struct CvSize2D32f

{

float width;

float height;

}

CvSize2D32f;

3.CvRect

图像的部分区域

派生自CvPoint和CvSize.

typedef struct CvRect

{

int x;

int y;

int width;

int height;

}

CvRect;

4.CvScalar

RGBA值

有一个单独的数据成员val , 它是一个指向4个双精度浮点数数组的指针.

typedef struct CvScalar

{

double val[4];

}

CvScalar

5.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;

二、矩阵的创建和释放:

1.矩阵的创建

Path1:  CvMat* cvCreateMat(int rows, int cols, int type) //分配内存空间

Path2:  CvMat* cvCreateMatHeader(int rows, int cols, int type) //不分配分配内存空间

Path3:  CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP)//利用现有的mat结构创建一个新的矩阵

Path4:  CvMat cvMat(int rows, int cols, int type, void* data=NULL) //轻量级创建一个矩阵并分配存储空间的办法

Path5:  CvMat* cvCloneMat(const CvMat* mat) //header and data are all allocated.

#include <cv.h>

#include <highgui.h>

int main()

{

float vals[]={0.866025,-0.50000,0.500000,0.866025};

CvMat rotmat;

cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals);

}

2.矩阵的存取方法:

1.简单的方法:

CV_MAT_ELEM()  CV_MAT_ELEM_PTR() 存取数据。

例程:

CvMat * mat1 = cvCreateMat( 5,5,CV_32FC1);

float element_3_3 = 7.7;

*((float *)CV_MAT_ELEM_PTR(*mat1,3,2) ) =element_3_3;

2.麻烦的方法:

返回指针的:

C: uchar* cvPtr1D(const CvArr* arr, int idx0, int* type=NULL)

C: uchar* cvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL)

C: uchar* cvPtr3D(const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL)

C: uchar* cvPtrND(const CvArr* arr, int* idx, int* type=NULL, int createNode=1, unsigned int* precalcHashval=NULL)

返回元素对象:

cvGetReal*D()

cvGet*D()

cvSetReal*D()

cvSet*D()

cvSet()//处理单通道数据

cvGet() //处理单通道数据

3.适当的方法

/**

累加一个三通道矩阵中的所有元素

**/

#include <cv.h>

#include <highgui.h>

float sum(const CvMat * mat)

{

float s = 0.0f;

for(int row=0;row<mat->rows;row++)

{

float * ptr = (float *)(mat->data.ptr + row * mat->step);//每一行都要重新计算起始位置

for(int col =0;col<mat->cols;col++)

{

s+= *ptr ++; //ptr++指向下一个数据

}

}

return s;

}

int main()

{

float vals[]={0.866025,-0.

3.点的数组

注意点的存储和内存布局的关系。

例如:有n个三维的点,存储到CvMat 结构中,有几种存储方式?

①用一个二维数组,数组的类型是:CV32FC1,n行3列

②用一个二维数组,数据的类型是:CV32FC1,3行n列

③用一个二维数组,数据的类型是:CV32FC3,n行1列

④用一个二维数组,数据的类型是:CV32FC3,1行n列

注意:CV32FC1等的结构都是顺序型的通道。通道的概率其实我也不是很明确。

目前的理解是:

我们可以看出,前三种的内存分配情况相同,但最后一种的内存分配不同。更复杂的是,如果有n维数组,每个数组的元素是c维(c可能是  通道数)时。所以,多维数组(矩阵)和一个一维但包含多维数据的数组一般是不同的。

    对于一个Rows行Cols列,通道数为Channels的矩阵,访问其中第row行,第col列,第channel通道的数据,可以使用如下公式:

  数据地址偏移量=row*Cols*Channels+col*Channels+channel

转载于:https://www.cnblogs.com/feng-fan/archive/2013/03/04/2943040.html

opencv学习笔记[9]:Opencv的基本数据类型和矩阵结构相关推荐

  1. OpenCV学习笔记#002 OpenCV相机检校例程运行

    OpenCV学习笔记#002 OpenCV相机检校例程运行 OpenCV学习笔记#002 OpenCV相机检校例程运行 所需文件 修改文件 修改in_VID5.xml 修改VID5.xml VS 设置 ...

  2. 【OpenCV学习笔记】2.1OpenCV基本数据类型

    OpenCV提供了多种基本数据类型.虽然这些数据类型在C语言中不是基本类型,但结构都很简单,可将它们作为原子类型.可以在"-/OpenCV/cxcore/include"目录下的c ...

  3. OpenCV学习笔记之OpenCV安装

    一.  Opencv的安装及配置 Qt有两种版本:mingw版本和MSVC版本.1.MSVC是指微软的VC编译器:2.MinGW是指是Minimalist GNU on Windows的缩写.它是一个 ...

  4. OpenCV学习笔记(3)——Scalar数据类型理解

    https://blog.csdn.net/liuweiyuxiang/article/details/76929534

  5. Opencv学习笔记之OpenCV介绍

    一.  OpenCV介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 ...

  6. Opencv学习笔记 - 关于OpenCV的UMat 类

    一个统一的抽象 cv::UMat 允许使用 CPU 或 OpenCL 代码实现相同的 API,而无需显式调用 OpenCL 加速版本.UMat类告诉 OpenCV 函数使用特定于 OpenCL 的代码 ...

  7. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  8. opencv学习笔记之像素处理

    文章目录 前言 一.多通道的分离合并 多通道分离函数split() 多通道合并函数merge() 二.图像像素统计 计算图像的平均值和标准差 前言 记录opencv有关像素操作的一些函数和功能 一.多 ...

  9. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  10. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

最新文章

  1. 剑指Offer(Java实现)扑克牌顺子
  2. sublime text 3设置快捷键让html文件在浏览器打开
  3. 二进制bit0是什么意思_模拟信号是什么 模拟信号数字传输原理介绍【图文】
  4. 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用
  5. 【转】用BlazeMeter录制JMeter测试脚本
  6. python自动注册邮箱_[转][Python][自动登录163邮箱]
  7. CSE 5/7350 – Project Course Timeslot and Student Assignment Project
  8. 渗透测试各种扫描工具集合(好用)
  9. 《Mybatis 手撸专栏》第10章:使用策略模式,调用参数处理器
  10. html网页计算器代码form,HTML网页之计算器代码
  11. 模糊综合评价在matlab上的实现
  12. 软件工程——软件结构图设计(变换分析设计、事务分析设计、混合流设计)
  13. 为什么qq相册显示服务器数据错误,玩qq空间常遇到的问题及解决办法_qq空间
  14. rsync: [sender] write error: Broken pipe (32) 问题排查
  15. c语言choice的用法,名词choice的用法与搭配
  16. SVN分支/主干Merge操作小记
  17. 兼容IE9的文件上传
  18. Ae效果控件快速参考:抠像
  19. 状态模式教你学会清蒸鲤鱼
  20. [软件工程] 面向对象设计

热门文章

  1. 感知机模型的对偶形式[转载]
  2. 2-05 使用固态存储SSD或PCIe卡
  3. AngularJS中的过滤器(filter)
  4. js设置全局变量ajax中赋值
  5. arrayPointer
  6. SecureCRT密钥远程登录Linux
  7. Screen Painter 程序设计
  8. Oracle的resetlogs机制浅析
  9. 此处为本人自勉自留地!
  10. mysql event 简单demo