已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,SouthwestUniversityofScienceandTechnology,程序设计综合训练OpenCV基础,张庆明.c2012/02/21,虚拟现实团队,个人简介,理学学士、工学博士,讲师中国民主促进会会员中国计算机学会(CCF)会员CCF-YOCSEF成都2012副主席西南科技大学三网融合技术咨询专家组秘书绵阳网络融合工程实验室科研秘书具有近10年数字视频技术方面的科研和教学工作。研究兴趣包括图像/视频处理、计算机视觉等。作为骨干成员参与完成了国家自然科学基金项目2项,横向项目2项。主持完成西南交通大学交通运输工程研究生创新实践基地项目基于X3D的虚拟现实技术在智能交通中的运用1项,目前正在主持西南科技大学博士基金项目多视点视频传输差错控制技术研究和绵阳网络工程实验室项目网络视频流检索技术研究的科研工作。至今在国内外著名期刊杂志、国际会议上发表论文10余篇,其中5篇被EI收录,获发明专利1项。,主要内容,OpenCV概述OpenCV基本数据类型和数据结构OpenCV基本操作(图形界面、图像、视频)基本OpenCV程序与示例(包含于基本操作中讲解)课堂练习注:本讲义中部分代码来自OpenCV样例,部分代码来自OpenCV教程基础篇,部分讲义内容从网上收集。,OpenCV概述,Open=OpenSource,CV=ComputerVisionOpenCV(OpenSourceComputerVisionLibrary)是Intel开源计算机视觉库。由一系列C函数和少量C+类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV拥有包括500多个C函数的跨平台的中、高层API,OpenCV为IntelIntegratedPerformancePrimitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的的IPP库,OpenCV将在运行时自动加载这些库。跨平台:Windows,Linux免费(FREE):无论对非商业应用和商业应用速度快、使用方便,OpenCV概述,OpenCV的重要特性:开源计算机视觉库采用C/C+编写;使用目的是开发实时应用程序;独立于操作系统、硬件和图形管理器;具有通用的图像/视频载入、保存和获取模块;具有底层和高层的应用开发包;,OpenCV概述,发展历史:2000年6月,第一个开源版本OpenCValpha3发布。2000年12月,针对linux平台的OpenCVbeta1发布。2006年,支持MacOS的OpenCV1.0发布。2009年9月,OpenCV1.2(beta2.0)发布。2009年10月1日,Version2.0发布。2010年12月6日,OpenCV2.2发布。2011年8月,OpenCV2.3发布。,OpenCV概述,应用领域:1、人机互动2、物体识别3、图象分割4、人脸识别5、动作识别6、运动跟踪7、机器人,OpenCV概述,OpenCV功能概述:,矩阵和向量的操作以及线性代数算法的实现图像数据的操作及矩阵结构和图像结构的转换基本的数字图像处理能力基本的GUI功能其他功能,OpenCV概述,OpenCV概述资源网站:OpenCV中文站,OpenCV概述,OpenCV结构组成:,CV计算机视觉算法,HighGUI用户界面,CXCore基础数据结构,ML机器学习,CVAux附加库,OpenCV概述,OpenCV主要模块库:,LIB,cv.lib:主要的OpenCV函数图像处理运动分析模式识别相机定标等,cxcore.lib:主要的数据结构线性代数支持,highgui.lib与图形界面相关的函数,cvaux.lib辅助的OpenCV函数立体匹配、3D跟踪,cvcam.lib摄像头读取模块,ml.Lib机器学习库分类器实现回归分析,OpenCV概述,OpenCV编码样式:1、文件命名:有cv和cvaux库文件的命名必须服从于以下规则:所有的CV库文件名前缀为cv混合的C/C+接口头文件扩展名为.h纯C+接口头文件扩展名为.hpp实现文件扩展名为.cpp为了与POSIX兼容,文件名都以小写字符组成,OpenCV概述,OpenCV编码样式:2、文件结构每个文件以BSD兼容的许可声明(模板在Contributors_BSD_Licsense.htm文件中可以找到)开头;一行最多90个字符,不包括行结束符不使用制表符缩进为4个空格符,所以制表符应该用1-4个空格替换(依据开始列确定)头文件必须使用保护宏,防止文件被重复包含。混合C/C+接口头文件用externC包含C语言定义。为了使预编译头机制在VisualC+中工作正常,源文件必须在其它头文件前包含precomp.h头文件。,OpenCV概述,OpenCV编码样式:3、命名约定OpenCV中使用大小写混合样式来标识外部函数、数据类型和类方法。宏全部使用大写字符,词间用下划线分隔。所有的外部或内部名称,若在多个文件中可见,则必须含有前缀:外部函数使用前缀cv内部函数使用前缀Icv数据结构(C结构体、枚举、联合体、类)使用前缀Cv外部或某些内部宏使用前缀CV_内部宏使用前缀ICV_,OpenCV概述,OpenCV编码样式:4、函数接口设计:为了保持库的一致性,以如下方式设计接口非常重要。函数接口元素包括:功能名称返回值参数类型参数顺序参数默认值函数功能必须定义良好并保持精简。函数应该容易镶入到使用其它OpenCV函数的不同处理过程。函数名称应该简单并能体现函数的功能。大多数函数名形式:cv,OpenCV概述,通道的概念:独立的颜色平面可简单理解为表示一个像素需要几个元素1通道:描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道,为1。2通道:2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便;还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。3通道:如果一个像素点,由RGB三种颜色来描述它,就是三通道,为3。4通道:windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,一般叫做alpha通道,表示透明度。,OpenCV概述,ROI的概念:ROI在opencv中是指Regionofinterest,感兴趣的区域的意思。COI的概念:COI是Channelofinterest的意思。在计算机表示图像的时候,是按RGBAplfa来表示一个像素的。每个R,G,B,Alfa都是一个Channel.Region是指图像中的某一部分。,OpenCV基本数据类型和数据结构,基本数据类型:点:CvPoint、CvPoint2D32f、CvPoint3D32f矩形框大小:CvSize、CvSize2D32f矩形框:CvRect可以存放1-4个数值的数组:CvScalar定义迭代算法的终止规则:CvTermCriteria矩阵:CvMat、CvMatND、CvSparseMatIPL图像头部:IplImage定义不确定的数组:CvArr(仅作函数参数),OpenCV基本数据类型和数据结构,点数据结构:CvPoint二维坐标系下的点,类型为整型typedefstructCvPointintx;/*X坐标,通常以0为基点*/inty;/*y坐标,通常以0为基点*/CvPoint;/*构造函数*/inlineCvPointcvPoint(intx,inty);/*从CvPoint2D32f类型转换得来*/inlineCvPointcvPointFrom32f(CvPoint2D32fpoint)CvPoint2D32f:二维坐标下的点,类型为浮点CvPoint3D32f:三维坐标下的点,类型为浮点,OpenCV基本数据类型和数据结构,矩形数据结构:CvSize矩形框大小,以像素为精度typedefstructCvSizeintwidth;/*矩形宽*/intheight;/*矩形高*/CvSize;/*构造函数*/inlineCvSizecvSize(intwidth,intheight);CvSize2D32f,OpenCV基本数据类型和数据结构,矩形数据结构:CvRect矩形框的偏移和大小typedefstructCvRectintx;/*方形的最左角的x-坐标*/inty;/*方形的最上或者最下角的y-坐标*/intwidth;/*宽*/intheight;/*高*/CvRect;/*构造函数*/inlineCvRectcvRect(intx,inty,intwidth,intheight);,OpenCV基本数据类型和数据结构,矩阵数据结构:typedefstructCvMatinttype;/*CvMat标识(CV_MAT_MAGIC_VAL),元素类型和标记*/intstep;/*以字节为单位的行数据长度*/int*refcount;/*数据引用计数*/unionuchar*ptr;short*s;int*i;float*fl;double*db;data;/*data指针*/#ifdef_cplusplusunionintrows;intheight;unionintcols;intwidth;#elseintrows;/*行数*/intcols;/*列数*/#endifCvMat;,OpenCV基本数据类型和数据结构,矩阵数据结构:inttype;矩阵通用矩阵数据类型:CV_(S|U|F)CS:带符号整数U:无符号整数F:浮点数。例:CV_8UC1:8位无符号单通道矩阵;CV_32FC2:32位浮点数双通道矩阵。,OpenCV基本数据类型和数据结构,矩阵数据结构:int*refcount;数据引用计数refcount=NULL:矩阵的数据区为外部数据,不需释放refcount!=NULL:需要释放矩阵头和数据区。intstep;以字节为单位的行数据长度是定位元素所需要的行信息,OpenCV基本数据类型和数据结构,矩阵数据结构:unionuchar*ptr;short*s;int*i;float*fl;double*db;data;指向数据区首地址的指针。指针是公用体结构,使用时要根据矩阵的数据类型选择。,OpenCV基本数据类型和数据结构,图像头结构:IplImage:IPL图像头typedefstruct_IplImageintnSize;/*IplImage大小*/intID;/*版本(=0)*/intnChannels;/*大多数OPENCV函数支持1,2,3或4个通道*/intalphaChannel;/*被OpenCV忽略*/intdepth;/*像素的位深度:IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U,IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32FandIPL_DEPTH_64F可支持*/charcolorModel4;charchannelSeq4;/*被OpenCV忽略*/intdataOrder;/*0-交叉存取颜色通道,1-分开的颜色通道.cvCreateImage只能创建交叉存取图像*/intorigin;/*0-顶左结构,1-底左结构(BMP风格)*/intalign;/*图像行排列(4or8).OpenCV用widthStep代替*/,OpenCV基本数据类型和数据结构,图像头结构:intwidth;/*图像宽像素数*/intheight;/*图像高像素数*/struct_IplROI*roi;/*图像感兴趣区域.当该值非空只对该区域进行处理*/struct_IplImage*maskROI;/*在OpenCV中必须置NULL*/void*imageId;/*同上*/struct_IplTileInfo*tileInfo;/*同上*/intimageSize;/*图像数据大小,单位字节*/char*imageData;/*指向排列的图像数据*/intwidthStep;/*排列的图像行大小,以字节为单位*/intBorderMode4;intBorderConst4;/*边际结束模式,被忽略*/char*imageDataOrigin;/*指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的*/IplImage;,OpenCV基本数据类型和数据结构,图像头结构:IplImage结构来自于IntelImageProcessingLibrary。OpenCV只支持其中的一个子集:alphaChannel在OpenCV中被忽略。colorModel和channelSeq被OpenCV忽略。dataOrder必须是IPL_DATA_ORDER_PIXEL(颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。align是被OpenCV忽略的,而用widthStep去访问后继的图像行。不支持maskROI。处理MASK的函数把他当作一个分离的参数。MASK在OpenCV里是8-bit,然而在IPL他是1-bit。tileInfo不支持。BorderMode和BorderConst是不支持的。OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或ROI的尺寸必须精确匹配。,OpenCV基本数据类型和数据结构,图像头结构:intdepth;图像通用数据类型:IPL_DEPTH_(S|U|F)S、U、F的意义同矩阵数据类型。例:IPL_DEPTH_8U:8位无符号整数图像IPL_DEPTH_32F:32位浮点数图像intnChannels;图像的通道数例:灰度图为1个通道复值图像为2个通道RGB图像为3个通道RGBA图像为4个通道(A通道即阿尔法通道,下去查资料了解)大多数OpenCV函数支持14个通道,OpenCV基本数据类型和数据结构,图像头结构:intdataOrder;图像数据的存储格式0:交叉存取颜色通道1:分开存取颜色通道OpenCV函数只支持交叉存取的图像。intwidthStep;排列的图像行长度,以字节为单位与矩阵结构中的step成员相似,OpenCV基本数据类型和数据结构,图像头结构:struct_IplROI*roi;ROI:RegionOfInterest(感兴趣区域)roi=NULL:整幅图像参与运算roi!=NULL:ROI区域代替图像参加运算ROI的操作:cvSetImageROI():设置ROI区域cvResetImageROI():取消ROI区域cvGetImageROI():得到ROI区域,OpenCV基本数据类型和数据结构,图像头结构:intorigin;图像像素的起始方式origin=0:顶-左结构origin=1:底-左结构(windows风格)char*imageData;图像的数据区char*类型而非unsignedchar*类型,进行浮点处理时可能要加到unsignedchar的转换,否则会导致结果不正常。,OpenCV基本数据类型和数据结构,不确定数组:CvArr:不确定数组只用作函数的参数表示可接受多种类型的输入形式(矩阵等)运行时通过分析数组头的前4个字节来判断大多数CvArr*做输出参数的情况下,函数是对CvArr的结构进行写入操作而不是返回指针,OpenCV基本操作,矩形操作:创建矩阵CreateMatCvMat*cvCreateMat(introws,intcols,inttype);Rows矩阵行数,cols矩阵列数。Type矩阵元素类型。通常以CV_(S|U|F)C型式描述,例如:CV_8UC1意思是一个8-bit无符号单通道矩阵,CV_32SC2意思是一个32-bit有符号二个通道的矩阵。函数cvCreateMat为新的矩阵分配头和下面的数据,并且返回一个指向新创建的矩阵的指针。矩阵按行存贮。所有的行以4个字节对齐。删除矩阵ReleaseMatvoidcvReleaseMat(CvMat*mat);例如:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvReleaseMat(,OpenCV基本操作,矩形操作:复制矩阵CloneMat:CvMat*cvCloneMat(constCvMat*mat);例如:CvMat*M1=cvCreateMat(4,4,CV_32FC1);CvMat*M2;M2=cvCloneMat(M1);初始化矩阵方法1:用cvMat初始化doublea=1,2,3,4,5,6,7,8,9,10,11,12;CvMatMa=cvMat(3,4,CV_64FC1,a);方法2:用cvCreateMatHeader初始化CvMatMa;cvInitMatHeader(,OpenCV基本操作,矩形操作:访问矩阵元素(1)直接访问cvmSet(M,i,j,2,0);/SetM(i,j)t=cvmGet(M,i,j);/GetM(i,j)(2)已知对齐方式的直接访问CvMat*M=cvCreateMat(4,4,CV_32FC1);intn=M-cols;float*data=M-data.fl;datai*n+j=3.0;/假设32位对齐(3)未知对齐方式的直接访问CvMat*M=cvCreateMat(4,4,CV_32FC1);intstep=M-step/sizeof(float);float*data=M-data.fl;(data+i*step)j=3.0;(4)直接访问一个已初始化的矩阵Mai*4+j=2.0;,OpenCV基本操作,矩形操作:矩阵间的操作CvMat*Ma,*Mb,*Mc;cvAdd(Ma,Mb,Mc);/Ma+Mb-MccvSub(Ma,Mb,Mc);/Ma-Mb-MccvMatMul(Ma,Mb,Mc);/Ma*Mb-Mc矩阵元素间的操作cvMul(Ma,Mb,Mc);/Ma.*Mb-MccvDiv(Ma,Mb,Mc);/Ma./Mb-MccvAddS(Ma,cvScalar(-10.0),Mc);/Ma.-10-Mc单个矩阵的操作cvTranspose(Ma,Mb);/transpose(Ma)-MbCvScalart=cvTrace(Ma);/trace(Ma)-t.val0doubled=cvDet(Ma);/det(Ma)-dcvInvert(Ma,Mb);/inv(Ma)-Mb,OpenCV基本操作,矩形操作:矩阵间的操作向量乘法,假设Va,Vb,Vc均为n元素向量doubleres=cvDotProduct(/A=UDVT标志使U和V以转置方式返回非齐次线性系统的求解假设A为n*n方阵,x,b均为n元素向量cvSolve((CV_WINDOW_AUTOSIZE=1)cvMoveWindow(ViewA,300,100);cvDestroyWindow(ViewA);cvShowImage(window_name,image);,OpenCV基本操作,交互操作:等待按键cvWaitKeyintcvWaitKey(intdelay=0)如果delay=0,则无限等待,否则等待delay毫秒则返回在程序循环中,有时候由于程序一直处于计算中,窗口无法重新恢复(如读出视频中的所有帧并显示),可以加入cvWaitKey,使之等待几毫秒,让窗口完成重新绘制再执行其他操作。其它交互函数,OpenCV基本操作,图像操作:创建头并分配数据CreateImageIplImage*cvCreateImage(CvSizesize,intdepth,intchannels);size:图像宽、高.depth:图像元素的位深度,IPL_DEPTH_8U|8S|16U|16S|32S|32F|64Fchannels:每个元素(像素)的颜色通道数量.可以是1,2,3或4.释放头和图像数据ReleaseImagevoidcvReleaseImage(IplImage*image);复制图像CloneImageIplImage*cvCloneImage(constIplImage*image);,OpenCV基本操作,图像操作:头分配CreateImageHeaderIplImage*cvCreateImageHeader(CvSizesize,intdepth,intchannels)初始化被用图分配的图像头InitImageHeaderIplImage*cvInitImageHeader(IplImage*image,CvSizesize,intdepth,intchannels,intorigin=0,intalign=4);originIPL_ORIGIN_TL或IPL_ORIGIN_BL.align图像行排列,典型的4或8字节.函数cvInitImageHeader初始化图像头结构,指向用户指定的图像并且返回这个指针。释放头ReleaseImageHeadervoidcvReleaseImageHeader(IplImage*image);,OpenCV基本操作,图像操作:从文件读图像cvLoadImageIplImage*cvLoadImage(char*fileName,intflag=1)OpenCV支持的图像格式:BMP、DIB、JPG、PNG、PBM、PGM、PPM、SR、RAS和TIFF写图像到文件cvSaveImageIplImage*cvSaveImage(char*fileName,IplImage*img)图像转换cvConvertImage(IplImage*src,IplImage*dst,intflags=0);/灰度图彩色图cvCvtColor(IplImage*src,IplImage*dst,intcode);/彩色图彩色图/灰度图Code=CV_2:,=RGB,BGR,GRAY,HSV,YCrCb,XYZ,Luv,HLS,OpenCV基本操作,图像操作:实例一:图像DCT变换-dct实例二:图像直方图统计-demhist,OpenCV基本操作,视频操作:打开摄像头CvCapture*cvCaptureFromCAM(camera_id=0);打开文件CvCapture*cvCaptureFromFile(videofile_path);CvCapture*cvCaptureFromAVI(inflie.avi);捕捉某一帧cvGrabFrame(capture)/抓住一帧,为快速遍历视频帧IplImage*img=cvRetrieveImage(capture);/把Grab的帧取出,或IplImage*cvQueryFrame(capture);释放捕捉源cvReleaseCapture(,OpenCV基本操作,视频操作:保存视频文件typedefstructCvVideoWriter;CvVideoWriter*cvCreateVideoWriter(constchar*filename,intfourcc,doublefps,CvSizeframe_size,intis_color=1);intcvWriteFrame(CvVideoWriter*writer,constIplImage*image);voidcvReleaseVideoWriter(CvVideoWriter*writer);,OpenCV基本操作,视频操作:获取/设置视频帧信息cvGetCaptureProperty(capture,property_id);cvSetCaptureProperty(capture,property_id,value);CV_CAP_PROP_POS_MSEC-videocapturetimestampCV_CAP_PROP_POS_FRAMES-0-basedindexoftheframeCV_CAP_PROP_POS_AVI_RATIO-relativepositionofvideo(0-start,1-end)CV_CAP_PROP_FRAME_WIDTH-widthofframesinthevideostreamCV_CAP_PROP_FRAME_HEIGHT-heightofframesinthevideostreamCV_CAP_PROP_FPS-framerateCV_CAP_PROP_FOURCC-4-charactercodeofcodecCV_CAP_PROP_FRAME_COUNT-numberofframesinvideofile,OpenCV基本操作,视频操作:实例一:边缘检测-laplace实例二:背景提取-foregroundcapture,OpenCV基本操作,内存操作:内存相关结构体及函数CvMemBlock内存存储块结构typedefstructCvMemBlockstructCvMemBlock*prev;structCvMemBlock*next;CvMemBlock;这是OpenCV所管理的基本的内存块,代表一个单独的内存存储块结构,一个双向的循环链表。,OpenCV基本操作,内存操作:内存相关结构体及函数CvMemStoragePos内存存储块地址typedefstructCvMemStoragestructCvMemBlock*bottom;/*firstallocatedblock*/structCvMemBlock*top;/*topofthestack*/structCvMemStorage*parent;/*newblocksfrom*/intblock_size;/*blocksize*/intfree_space;/*freespaceinthetopblock(inbytes)*/CvMemStorage;一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块(CvMemBlock)构成,呈列表型。存储器就如同栈,bottom指向栈底,top指向栈顶。,OpenCV基本操作,内存操作:内存相关结构体及函数CreateMemStorage创建内存块CvMemStorage*cvCreateMemStorage(intblock_size=0);block_size:存储块的大小以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论