OpenCV具有以下的特征ppt课件.ppt

上传人:牧羊曲112 文档编号:1376577 上传时间:2022-11-16 格式:PPT 页数:47 大小:157KB
返回 下载 相关 举报
OpenCV具有以下的特征ppt课件.ppt_第1页
第1页 / 共47页
OpenCV具有以下的特征ppt课件.ppt_第2页
第2页 / 共47页
OpenCV具有以下的特征ppt课件.ppt_第3页
第3页 / 共47页
OpenCV具有以下的特征ppt课件.ppt_第4页
第4页 / 共47页
OpenCV具有以下的特征ppt课件.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《OpenCV具有以下的特征ppt课件.ppt》由会员分享,可在线阅读,更多相关《OpenCV具有以下的特征ppt课件.ppt(47页珍藏版)》请在三一办公上搜索。

1、OpenCV简介,OpenCV的特征,OpenCV具有以下的特征:()开源计算机视觉采用编写。()使用目的是开发实时应用程序。()独立与操作系统、硬件和图形管理器。()具有通用的图象视频载入、保存和获取模块。()具有底层和高层的应用开发包。,OpenCV的功能,应用OpenCV能够实现以下功能:()对图象数据的操作,包括分配、释放、复制和转换数据。()对图象和视频的输入输出,指文件和摄像头作为输入,图象和视频文件作为输出。()具有对距陈和向量的操作以及线性代数的算法程序,包括距阵、解方程、特征值以及奇异值。()可对各种动态数据结构,如列表、队列、集合、树和图等进行操作。()具有基本的数字图象处

2、理能力,如可进行滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图和图象金字塔等操作。,()可对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种距的计算、模板匹配、Hongh变换、多边形逼近、直线拟合、椭圆拟合和Delaunay三角划分等。(7)对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应。(8)对运动的分析,如对光流、运动分割和跟踪的分析。(9)对目标的识别,可采用特征法和隐马尔科夫模型(HMM)法。(10)具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等。(11)可对图像进行标注,如对线、二次曲线和多边形

3、进行标注,还可以书写文字(目前之支持中文)。,OpenCV模块,OpenCV包括以下几个模块,其具体功能是:(1)CV主要的OpenCV函数。(2)CVAUX辅助的(实验性)OpenCV函数。(3)CXCORE数据结构与线性代数支持。(4)HIGHGUI图像界面函数。(5)ML机器学习,包括模式分类和回归分析等。(6)CVCAM负责读取摄像头数据的模块(在以后版本中,当HIGHGUI模块中加入Direct Show支持后,此模块将被废除)。,学习资源,目前,OpenCV方面的资源已经很多,当然最简单的方法还是在网上搜索,比如在Google搜索引擎(http:/)中输入”OpenCV”即可进行相

4、关查找,这里给出一些信息作为参考。(1)参考手册 英文 请打开文件/docs/index.htm进行查询。 中文 请打开网页http:/ 官方网站 网址是http:/ 中文官方网站 网址是http:/ 软件下载 网址是http:/ 请阅读北京航空航天大学出版社出版的OpenCV教程。,OpenCV基础,.OpenCV命名规则.基本数据结构.矩阵的使用与操作.图象的使用与操作.数据结构与数据操作,OpenCV命名规则,1.函数命名规则 通用函数名为 cvActionTargetMod() 其中,Action表示核心函数(比如:Set,Create); Target表示目标图像区域(比如:轮廓,多

5、边形); Mod表示可选变种(比如:变量类型)。2.矩阵数据类型 通用矩阵数据类型为 CV_ 其中,S表示带符号整数; U表示无符号整数; F表示浮点数。 例如:CV_8UC1表示8位无符号单通道矩阵; CV_32FC2表示32位浮点数双通道矩阵。,3.通用图像数据类型为 IPL_DEPTH_(S|U|F) 其中,S,U,F的意义同矩阵数据类型。 例如:IPL_DEPTH_8U表示8位无符号整数图像 IPL_DEPTH_32F表示32位浮点数图像4.头文件OpenCV的头文件有如下几个:#include#include#include#include/不是必须的,它包含在cv.h中,基本的数据

6、结构,1.图像结构2.矩阵的与向量结构3.其他的数据结构(1)点的表示(2)长方形维数的表示(3)有偏移量的长方形表示,图像结构,Opencv中的所有图像都采用同一个结构IplImage,该图像结构说明参考后面的PPT。实际上, IplImage是借鉴于Intel公司最早发布的IPP图像处理开发包中的定义;但由于IPP并非开源项目,因此对于OpenCV基本采用这个较复杂的图像结构,其版权方面的问题还有待研究。,矩阵与向量结构,矩阵与向量结构的 和说明也可以参见后面的PPT。OpenCV采用一种独特的结构CvArr*。该结构是一个通用数组的表现形式,用做函数的参数,说明函数在调用该参数时接受多种

7、类型的输入数据形式,比如IplImage*,CvMat*甚至CvSeq*。具体的数组形式在运行时应根据实际情况来分析。,其他数据结构,(1)点的表示:CvPoint p=cvPoint(int x,int y);CvPoint2D32f p=cvPoint2D32f (float x,float y);CvPoint3D32f p=cvPoint3D32f (float x,float y,float z);Eg:p.x=5.0p.y=5.0,(2)长方形的维数表示:CvSize r=cvSize(int width,int height);CvSize2D32f r=cvSize2D32f(

8、float width,float height);(3)有便移量的长方形表示Cvrectrcvrect (int x,int y,int width,int height);,矩阵的使用和操作,.分配和释放矩阵OpenCV有一个矩阵操作的语言的接口,另外也有一些语言的矩阵操作接口,通常语言接口更方便,且同样有效。在OpenCV中,向量是被当成是行或列为的矩阵,并且矩阵在内存中的存储方式是按行存储,且每行按字节对齐。,(1)分配矩阵分配矩阵的原型为CvMat * cvCreateMat(int rows,int cols,int type);其中,type 表示矩阵元素的类型,可以用如下形式表

9、达CV_(S|U|F)CEg:CvMat* M = cvCreateMar(4,4CV_32FC1);(2)释放矩阵释放矩阵的函数原型为Void cvReleaseMat(CvMat*);Eg:CvMat* M = cvCreateMat(4,4,CV_32FC1);cvReleaseMat(,(3)复制矩阵复制矩阵的函数原型为CvMat* cvCloneMat(cvMat);Eg:CvMat* M1 = cvCreateMat(4,4,CV_32FC1);CvMat* M2;M2 = cvCloneMat(M1);(4)初始化矩阵可按如下方法初始化一个行列矩阵。Double a = 1,2,

10、3,4, 5,6,7,8, 9,10,11,12;CvMat Ma = cvMat(3,4,CV_64FC1,a);或者:CvMat Ma;CvInitMatHeader(,(5)初始化单位矩阵可按如下方法初始化一个单位矩阵。CvMat* M = cvCreateMat(4,4,CV_32FC1);cvSetIdentity(M);,访问矩阵元素,直接访问下例是对元素M(i,j)进行数据赋值和读取。cvmSet(M,I,j,2,0); /set M(i,j)t = cvmGet(M,i,j); /Get M(i,j)(2)已知对齐方式的直接访问下例是对32位对齐方式存储的元素进行赋值。CvMa

11、t* M = cvCreateMat(4,4CV_32FC1);int n = M-cots;float * data = M-data.fl;Datai*n+j = 3.0;,(3) 未知对齐方式的直接访问下例是对某种对齐方式存储的元素进行赋值。CvMat* M = cvCreateMat(4,4CV_32FC1);int step = M-step/sizeof(float);float * data = M-data.fl;(data + i*step) i= 3.0; (4)直接访问一个已初始化的矩阵下例对已出吃化的矩阵a进行数据赋值。Double a16;CvMat Ma = cvM

12、at(3,4,CV_64FC1,a);Ai*4+j = 2.0; /Ma(i,j) = 2.0;,矩阵的向量操作,对矩阵和向量的操作分以下几种类型。(1)矩阵与矩阵之间的操作此类型包括:CvMat* Ma,*Mb,*Mc;cvAdd(Ma,Mb,Mc); /Ma+Mb-MccvSub(Ma,Mb,Mc); /Ma-Mb-MccvMatMul(Ma,Mb,Mc); /Ma*Mb-Mc,(2)矩阵元素之间的操作此类型包括:CvMat* Ma,*Mb,*Mc;cvMul(Ma,Mb,Mc); /Ma.*Mb-MccvDiv(Ma,Mb,Mc); /Ma./Mb-MccvAddS(Ma,cvScala

13、r(-10.0),Mc); /Ma.-10-Mc(3)向量乘法操作此类型包括:double va=1,2,3;double vb=0,0,1;double vc3;CvMat Va = cvMat(3,1,CV_64FC1,va);CvMat Vb = cvMat(3,1,CV_64FC1,vb);CvMat Vc = cvMat(3,1,CV_64FC1,vc);double res = cvDotProduct( /cross product:Va*Vb-Vc注意VA,VbVc在叉积中必须是个元素的向量。,(4)单个矩阵的操作此类型包括:CvMat *Ma,*Mb;cvTranspose(

14、Ma,Mb);CvScalar t = cvTrace(Ma0;Double d = cvDet(Ma);cvInvert(Ma,Mb);(5)非齐次线性系统求解操作此类型包括:CvMat* A = cvCreateMat(3,3,CV_32FC1);CvMat* x = cvCreateMat(3,3,CV_32FC1);CvMat* b = cvCreateMat(3,3,CV_32FC1);cvSolve(,(6)特征值分析(对称矩阵)操作此类型包括:CvMat* A= cvCreateMat(3,3,CV_32FC1);CvMat* E= cvCreateMat(3,3,CV_32FC

15、1);CvMat* I= cvCreateMat(3,3,CV_32FC1);cvEigenVV(,图象的使用与操作,分配和释放图象(1)分配一幅图象分配图象的函数原型为IplImage* cvCreateImage(CvSize size,int depth,int channels);Eg1:IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);Eg2:IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);,(2)释放一幅图象释放图象的函数原型为Void

16、 cvReleaseImage(IplImage*);Eg:IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);cvReleaseImage(,(4)设置或得到感兴趣区域ROI函数原型分别为Void cvSetImageROI(IplImage* image,CvRec rect);Void cvResetImageROI(IplImage* image);vRect cvGetImageROI(IplImage* image);大多数OpenCv函数都支持ROI。(5)设置或得到感兴趣区域COI函数原型分别为Void cvS

17、etImageCOI(IplImage* image,int coi);/0=allInt cvGetImageCOI(IplImage* image);大多数OpenCv函数都支持COI。,图象的读写,(1)从文件读区图象IplImage* img = 0;img = cvLoadImage(fileName);If(!img) printf(“Couldnot load image file:%sn”,fileName);默认情况下:img = cvLoadImage(fileName,flag);flag取不同的值表示的意义不同(2)向文件中写图象If(!cvSaveImage(outF

18、ileName,img) printf(“Could not save:%sn”,outFileName);输出的图象文件格式依赖于文件的扩展名。,访问图像像素,(坐标是从0开始的,并且是相对图像原点的位置。图像原点或者是左上角 (img-origin=IPL_ORIGIN_TL) 或者是左下角 (img-origin=IPL_ORIGIN_BL) ) 假设有 8-bit 1通道的图像 I (IplImage* img): I(x,y) (uchar*)(img-imageData + img-widthStep*y)x,假设有 8-bit 3-通道的图像 I (IplImage* img):

19、 I(x,y)blue (uchar*)(img-imageData + img-widthStep*y)x*3 I(x,y)green (uchar*)(img-imageData + img-widthStep*y)x*3+1 I(x,y)red (uchar*)(img-imageData + img-widthStep*y)x*3+2 例如,给点 (100,100) 的亮度增加 30 ,那么可以这样做: CvPoint pt = 100,100; (uchar*)(img-imageData + img-widthStep*pt.y)pt.x*3 += 30; (uchar*)(img

20、-imageData + img-widthStep*pt.y)pt.x*3+1 += 30; (uchar*)(img-imageData + img-widthStep*pt.y)pt.x*3+2 += 30; 或者更高效地: CvPoint pt = 100,100; uchar* temp_ptr = ,假设有 32-bit 浮点数, 1-通道 图像 I (IplImage* img): I(x,y) (float*)(img-imageData + img-widthStep*y)x,现在,一般的情况下,假设有 N-通道,类型为 T 的图像: I(x,y)c (T*)(img-ima

21、geData + img-widthStep*y)x*N + c 你可以使用宏 CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc ) I(x,y)c CV_IMAGE_ELEM( img, T, y, x*N + c ) 也有针对各种图像(包括 4 通道图像)和矩阵的函数(cvGet2D, cvSet2D), 但是它们非常慢。,数据结构与数据操作,1 CvPoint 2 CvPoint2D32f 3 CvPoint3D32f 4 CvSize 5 CvSize2D32f 6 CvRect 7 CvScalar 8 CvTermCriteria 9 C

22、vMat 10 CvMatND 11 CvSparseMat 12 IplImage 13 CvArr,CvPoint,二维坐标系下的点,类型为整型 typedef struct CvPoint int x; /* X坐标, 通常以0为基点 */ int y; /* y坐标, 通常以0为基点 */ CvPoint; /* 构造函数 */ inline CvPoint cvPoint( int x, int y ); /* 从 CvPoint2D32f类型转换得来 */ inline CvPoint cvPointFrom32f( CvPoint2D32f point ),CvPoint2D32

23、f,二维坐标下的点,类型为浮点 typedef struct CvPoint2D32f float x;/* X坐标, 通常以0为基点*/ float y; /* Y坐标, 通常以0为基点*/ CvPoint2D32f; /* 构造函数 */ inline CvPoint2D32f cvPoint2D32f( double x, double y ); /* 从CvPoint转换来 */ inline CvPoint2D32f cvPointTo32f( CvPoint point );,CvPoint3D32f,三维坐标下的点,类型为浮点 typedef struct CvPoint3D32

24、f float x; /* x-坐标, 通常基于0 */ float y; /* y-坐标, 通常基于0 */ float z; /* z-坐标, 通常基于0 */ CvPoint3D32f; /* 构造函数 */ inline CvPoint3D32f cvPoint3D32f( double x, double y, double z );,CvSize,矩形框大小,以像素为精度 typedef struct CvSize int width; /* 矩形宽 */ int height; /* 矩形高 */ CvSize; /* 构造函数 */ inline CvSize cvSize(

25、int width, int height );,CvSize2D32f,以亚像素精度标量矩形框大小 typedef struct CvSize2D32f float width; /* 矩形宽 */ float height; /* 矩形高 */ CvSize2D32f; /* 构造函数*/ inline CvSize2D32f cvSize2D32f( double width, double height ); CvSize2D32f s; s.width = (float)width; s.height = (float)height; return s;,CvRect,矩形框的偏移和

26、大小 typedef struct CvRect int x; /* 方形的最左角的x-坐标 */ int y; /* 方形的最上或者最下角的y-坐标 */ int width; /* 宽 */ int height; /* 高 */ CvRect; /* 构造函数*/ inline CvRect cvRect( int x, int y, int width, int height );,CvScalar,可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的容器 typedef struct CvScalar double val4 CvScalar; /* 构造函数:用val0初始化v

27、al0用val1初始化val1, 以此类推*/inline CvScalar cvScalar( double val0, double val1=0, double val2=0, double val3=0 ); /* 构造函数:用val0123初始化所有val0.val3 */ inline CvScalar cvScalarAll( double val0123 ); /* 构造函数:用val0初始化val0,用0初始val1,val2,val3 */ inline CvScalar cvRealScalar( double val0 ); http:/doc.blueruby.myd

28、ns.jp/opencv/classes/OpenCV/CvScalar.html,CvTermCriteria,迭代算法的终止准则 #define CV_TERMCRIT_ITER 1 #define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER#define CV_TERMCRIT_EPS 2 typedef struct CvTermCriteria int type; /* CV_TERMCRIT_ITER 和CV_TERMCRIT_EPS二值之一,或者二者的组合 */ int max_iter; /* 最大迭代次数 */ double epsilon; /*

29、 结果的精确性 */ CvTermCriteria; /* 构造函数 */ inline CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon ); 在满足max_iter和epsilon的条件下检查终止准则并将其转换使得type=CV_TERMCRIT_ITER+CV_TERMCRIT_EPS */ CvTermCriteria cvCheckTermCriteria( CvTermCriteria criteria, double default_eps, int default_max_iters );

30、,CvMat多通道矩阵,CvMatND 多维、多通道密集数组,CvSparseMat 多维、多通道稀疏数组,IplImage IPL 图像头,IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集: alphaChannel 在OpenCV中被忽略。 colorModel 和channelSeq 被OpenCV忽略。OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。 dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存

31、取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。 align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。 不支持maskROI 。处理MASK的函数把他当作一个分离的参数。MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。 tileInfo 不支持。 BorderMode和BorderConst是不支持的。每个 OpenCV 函数处理像素的邻近的像素,通常使用单一的固定代码边际模式。 除了上述限制,OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或 ROI的尺寸必须(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 1)精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。 编辑,CvArr,不确定数组 typedef void CvArr; CvArr* 仅仅是被用于作函数的参数,用于指示函数接收的数组类型可以不止一个,如 IplImage*, CvMat* 甚至 CvSeq*. 最终的数组类型是在运行时通过分析数组头的前4 个字节判断。 取自http:/,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号