OpenCV 数据结构和图像处理_第1页
OpenCV 数据结构和图像处理_第2页
OpenCV 数据结构和图像处理_第3页
OpenCV 数据结构和图像处理_第4页
OpenCV 数据结构和图像处理_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OpenCV 数据类型和图像处理周杉 OpenCVOpenCV基本数据类型和数据结构基本数据类型和数据结构【基本数据类型】【基本数据类型】 点:点: CvPoint 、CvPoint2D32f、CvPoint3D32f 矩形框大小:矩形框大小: CvSize 、CvSize2D32f 矩形框:矩形框: CvRect 可以存放可以存放1-41-4个数值的数组:个数值的数组: CvScalarCvScalar 矩阵:矩阵: CvMat 、CvMatND 、CvSparseMat IPLIPL图像头部:图像头部: IplImage 定义不确定的数组:定义不确定的数组: CvArr (仅作函数参数)多

2、维稀疏矩阵多维稀疏矩阵OpenCVOpenCV基本数据类型和数据结构基本数据类型和数据结构【点数据结构】【点数据结构】 CvPoint 二维坐标系下的点,类型为整型 typedef struct CvPoint int x; /* X坐标, 通常以0为基点 */int y; /* y坐标, 通常以0为基点 */CvPoint;inline CvPoint cvPoint( int x, int y ); /* 构造函数 */inline CvPoint cvPointFrom32f( CvPoint2D32f point ) /* 从 CvPoint2D32f类型转换得来 */ CvPoint

3、2D32f :二维坐标下的点,类型为浮点 CvPoint3D32f :三维坐标下的点,类型为浮点OpenCVOpenCV基本数据类型和数据结构基本数据类型和数据结构【矩形数据结构】【矩形数据结构】 CvSize 矩形框大小,以像素为精度 typedef struct CvSizeint width; /* 矩形宽 */int height; /* 矩形高 */CvSize;inline CvSize cvSize( int width, int height ); /* 构造函数*/ CvSize2D32f OpenCVOpenCV基本数据类型和数据结构基本数据类型和数据结构【矩形数据结构】【

4、矩形数据结构】 CvRect 矩形框的偏移和大小 typedef struct CvRectint x; /* 方形的最左角的x-坐标 */int y; /* 方形的最上或者最下角的y-坐标 */int width; /* 宽 */int height; /* 高 */CvRect;inline CvRect cvRect(int x, int y, int width, int height); /* 构造函数*/OpenCVOpenCV基本数据类型和数据结构基本数据类型和数据结构【矩阵矩阵数据结构】数据结构】 typedef struct CvMat int type; /* CvMat

5、标识 (CV_MAT_MAGIC_VAL), 元素类型和标记 */ int step;/* 以字节为单位的行数据长度*/ int* refcount; /* 内部使用,数据引用计数 */ union uchar* ptr;short* s; int* i; float* fl; double* db; data; /* data 指针 */ union int rows; int height; ; union int cols; int width; ; CvMat;int type; 矩阵通用矩阵数据类型: CV_(S|U|F)CS:带符号整数U:无符号整数F:浮点数例:CV_8UC1:8

6、位无符号单通道矩阵; CV_32FC2:32位浮点数双通道矩阵。int* refcount; /*数据引用计数*/ refcount=NULL: 矩阵的数据区为外部数据,不需释放 refcount!=NULL: 需要释放矩阵头和数据区。 int step; 以字节为单位的行数据长度,是定位元素所需要的行信息。 unionuchar *ptr;short *s;int *i;float *fl;double *db;data; 指向数据区首地址的指针。指针是公用体结构,使用时要根据矩阵的数据类型选择。 矩阵矩阵由宽度(width),高度(height),类型(type),行数据长度(step,行

7、的长度用字节表示而不是用整形或者浮点型长度)和一个指向数据的指针构成。 CvMatCvMat* * cvCreateMat(int rows,int cols,int type) cvCreateMat(int rows,int cols,int type) 该方法最简单,既设置了矩阵的头部,又为数据部分分配了内存空间,该函数是cvCreateMatHeader()和cvCreateData()的合并缩写。 cvCreateMatHeader()cvCreateMatHeader() 只创建CvMat头部,但不为数据部分分配空间。 cvCreateData()cvCreateData() 则是

8、为矩阵的数据部分分配了内存空间。有时候,我们只需要cvCreateMatHeader()就可以了,因为基于一些原因,我们可能已经为数据部分分配了空间,或者此时分配空间还不是时候。 cvCloneMat(CvMatcvCloneMat(CvMat* *) ) 是从一个已经有的矩阵,来“克隆”出一个新的 矩 阵 来 。 当 我 们 不 再 需 要 某 矩 阵 时 , 我 们 需 要 调 用 长cvReleaseMat(CvMat*)来释放它。矩阵的创建矩阵的创建typedef struct _IplImage int nSize; /* IplImage大小 */ int ID; /* 版本 (=

9、0)*/ int nChannels; /* 大多数OpenCV函数支持1,2,3 或4 个通道 */ int alphaChannel; /* 被OpenCV忽略 */ int depth; /* 像素的位深度:IPL_DEPTH_8U;IPL_DEPTH_8S; IPL_DEPTH_16U;IPL_DEPTH_16S;IPL_DEPTH_32S;IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */ char colorModel4; /* 被OpenCV忽略 */ char channelSeq4; /* 被OpenCV忽略 */ int dataOrder; /*

10、 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.cvCreateImage只能创建交叉存取图像 */ int origin;/* 0 - 顶左结构,1 - 底左结构 (BMP风格) */ int align; /* 图像行排列 (4 or 8). OpenCV 用widthStep 代替 */IplImage:IPL 图像头图像头 接上一张PPT内容: int width; /* 图像宽像素数 */int height; /* 图像高像素数*/struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */struct _IplImage *maskRO

11、I; /* 在 OpenCV中必须置NULL */void *imageId; /* 同上*/ struct _IplTileInfo *tileInfo; /*同上*/ int imageSize; /* 图像数据大小,单位字节*/ char *imageData; /* 指向第一行排列图像数据的指针 */ int widthStep; /* 排列的图像行大小,以字节为单位 */ int BorderMode4; /* 边际结束模式, 被忽略*/ int BorderConst4; /* 边际结束模式, 被忽略*/ char *imageDataOrigin; /* 指针指向一个不同的图像数

12、据结构,是为了纠正图像内存分配准备的 */ IplImage;图像头结构图像头结构int depth; 图像通用数据类型: IPL_DEPTH_(S|U|F) S、U、F的意义同矩阵数据类型。 例:IPL_DEPTH_8U:8位无符号整数图像 IPL_DEPTH_32F:32位浮点数图像int nChannels;图像的通道数例:灰度图为1个通道复值图像为2个通道RGB图像为3个通道RGBA图像为4个通道(A通道即阿尔法通道) 大多数OpenCV函数支持14个通道 int dataOrder; 图像数据的存储格式 0 :交叉存取颜色通道 1:分开存取颜色通道 OpenCV函数只支持交叉存取的图

13、像。int widthStep; 排列的图像行长度行长度,以字节为单位,与矩阵结构中的step成员相似。struct _IplROI *roi; ROI:Region Of Interest(感兴趣区域)roi=NULL:整幅图像参与运算roi!=NULL:ROI区域代替图像参加运算ROI的操作:cvSetImageROI():设置ROI区域cvResetImageROI():取消ROI区域cvGetImageROI():得到ROI区域int origin; 图像像素的起始方式 origin=0:顶-左结构 origin=1:底-左结构(windows风格)char *imageData; 图

14、像的数据区 char *类型而非unsigned char *类型,进行浮 点处理时可能要加到unsigned char的转换,否则会导致结果不正常。 CvArr:不确定数组 只用作函数的参数 表示可接受多种类型的输入形式 (矩阵等) 运行时通过分析数组头的前4个字节来判断 大多数CvArr*做输出参数的情况下,函数是对CvArr的结构进行写入操作而不是返回指针不确定数组不确定数组图像处理图像处理 平滑处理* 图像形态学* 漫水填充算法 尺寸调整 图像金字塔 阈值化一、平滑处理一、平滑处理 “平滑处理”也称“模糊处理”,是一项简单而且使用频率很高的图像处理方法。常用作处理图像上的噪声或者失真。

15、降低图像分辨率时,平滑处理是很重要的。 目前,OpenCV可以提供五种不同的平滑处理操作方法,所有操作都有cvsmoothcvsmooth函数函数实现,该函数可以将用户所期望的平滑方式作为参数。 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype = CV_GAUSSIAN, int param1 = 3, int param2 = 0, double param3 = 0, double param4 = 0 );各种平滑处理实验结果对比图各种平滑处理实验结果对比图图1:简单模糊处理图2:中值滤波模糊处理图3:高斯模糊图4:

16、双边滤波二、图像形态学二、图像形态学 OpenCV为进行图像的形态学变换提供了快速、方便的函数。基本形态转换是膨胀与腐蚀,他们能实现多种功能:例如消除噪声、分割出独立的图像元素以及在图像中连接相邻的元素。形态学也常被用于寻找图像中的明显的极大值区域或极小值区域以及求出图像的梯度。腐蚀腐蚀: : 删除对象边界某些像素删除对象边界某些像素 腐蚀是膨胀的反操作。腐蚀操作要计算核区域像素的最小值最小值。 当核B与图像卷积时,计算被B覆盖区域的最小像素值,并把这个值放到参考点上。形态腐蚀:在核B之下取最小像素值腐蚀腐蚀-设计思想设计思想结构元素结构元素原二值图腐蚀后的图 设计一个结构元素,结构元素的原点

17、定位在待处理的目标像素目标像素上,通过判断是否覆盖,来确定是否该点被腐蚀掉。 扫描原图,找到第一个扫描原图,找到第一个像素值为像素值为1的背景点。判断该结构元素所覆盖的像的背景点。判断该结构元素所覆盖的像素值素值是否是否全部全部为为1。如果是,则腐蚀后图像中的相同位置上的像素值为1;如果不是,则腐蚀后图像中的相同位置上的像素值为0。腐蚀腐蚀-应用示例应用示例1 1 腐蚀处理腐蚀处理可以将粘连在一起的不同目标物分离,可以将粘连在一起的不同目标物分离,并可以将小的颗粒噪声去除。并可以将小的颗粒噪声去除。(a)原图(b)腐蚀1次(c)腐蚀2次图像的腐蚀效果腐蚀腐蚀-应用示例应用示例2 2(a)原图(

18、b)腐蚀2次膨胀膨胀: : 给图像中的对象边界添加像素给图像中的对象边界添加像素形态学膨胀:在核B下取最大像素值 膨胀膨胀是将与目标区域的背景点合并到该目标物中,使目标物边界向外部扩张的处理。 膨胀膨胀可以用来填补目标区域中存在的某些空洞,以及清除包含在目标区域中的小颗粒噪声。膨胀膨胀-设计思想设计思想 设计一个结构元素,结构元素的原点定位在设计一个结构元素,结构元素的原点定位在背景像素背景像素上,判断是否覆盖有目标点,来确定是上,判断是否覆盖有目标点,来确定是否该点被膨胀为目标点。否该点被膨胀为目标点。 扫描原图,找到第一个扫描原图,找到第一个像素值为像素值为0 0的背景点。的背景点。判断该结构元素所覆盖的像素值判断该结构元素所覆盖的像素值是否是否存在存在为为1 1的目的目标点标点。结构元素结构元素膨胀膨胀-应用示例应用示例1 1 膨胀处理可以将断裂开的目标物进行合 并,便于对其整体的提取。膨胀膨胀-应用示例应用示例2 2(2)原图(b)膨胀一次CvScalar CvScalar 如何赋值呢?如何赋值呢? 1. inline CvScalar cvScalarcvScalar( double val=0, double val1=0,double val2=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论