《程序设计综合训练-opencv基础.ppt》由会员分享,可在线阅读,更多相关《程序设计综合训练-opencv基础.ppt(59页珍藏版)》请在三一办公上搜索。
1、,Southwest University of Science and Technology,程序设计综合训练OpenCV基础,张庆明2012/02/21,虚拟现实团队,个人简介,理学学士、工学博士,讲师中国民主促进会会员中国计算机学会(CCF)会员CCF-YOCSEF成都2012副主席西南科技大学三网融合技术咨询专家组秘书绵阳网络融合工程实验室科研秘书具有近10年数字视频技术方面的科研和教学工作。研究兴趣包括图像/视频处理、计算机视觉等。作为骨干成员参与完成了国家自然科学基金项目2项,横向项目2项。主持完成西南交通大学交通运输工程研究生创新实践基地项目基于X3D的虚拟现实技术在智能交通中的
2、运用1项,目前正在主持西南科技大学博士基金项目多视点视频传输差错控制技术研究和绵阳网络工程实验室项目网络视频流检索技术研究的科研工作。至今在国内外著名期刊杂志、国际会议上发表论文10余篇,其中5篇被EI收录,获发明专利1项。,主要内容,OpenCV概述OpenCV基本数据类型和数据结构OpenCV基本操作(图形界面、图像、视频)基本OpenCV程序与示例(包含于基本操作中讲解)课堂练习注:本讲义中部分代码来自OpenCV样例,部分代码来自OpenCV教程基础篇,部分讲义内容从网上收集。,OpenCV概述,Open=Open Source,CV=Computer VisionOpenCV(Ope
3、n Source Computer Vision Library)是Intel开源计算机视觉库。由一系列 C 函数和少量 C+类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 500 多个C函数的跨平台的中、高层 API,OpenCV 为Intel Integrated Performance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的的 IPP 库,OpenCV 将在运行时自动加载这些库。跨平台:Windows,Linux免费(FREE):无论对非商业应用和商业应用 速度快、使用方便,OpenCV概述,OpenCV 的重要特性:
4、开源计算机视觉库采用C/C+编写;使用目的是开发实时应用程序;独立于操作系统、硬件和图形管理器;具有通用的图像/视频载入、保存和获取模块;具有底层和高层的应用开发包;,OpenCV概述,发展历史:2000年6月,第一个开源版本OpenCV alpha 3发布。2000年12月,针对linux平台的OpenCV beta 1发布。2006年,支持Mac OS的OpenCV 1.0发布。2009年9月,OpenCV 1.2(beta2.0)发布。2009年10月1日,Version 2.0发布。2010年12月6日,OpenCV 2.2发布。2011年8月,OpenCV 2.3发布。,OpenCV
5、概述,应用领域:1、人机互动 2、物体识别 3、图象分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人,OpenCV概述,OpenCV功能概述:,矩阵和向量的操作以及线性代数算法的实现图像数据的操作及矩阵结构和图像结构的转换 基本的数字图像处理能力基本的GUI功能 其他功能,OpenCV概述,OpenCV概述资源网站:OpenCV中文站 OpenCV英文站 OpenCV项目主页:源代码及文档下载 http:/,OpenCV概述,OpenCV结构组成:,CV计算机视觉算法,HighGUI用户界面,CXCore基础数据结构,ML机器学习,CVAux附加库,OpenCV概述,OpenCV主要
6、模块库:,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兼容,文件名都以小写字符组成,
7、OpenCV概述,OpenCV编码样式:2、文件结构每个文件以BSD兼容的许可声明(模板在Contributors_BSD_Licsense.htm文件中可以找到)开头;一行最多90个字符,不包括行结束符 不使用制表符 缩进为4个空格符,所以制表符应该用1-4个空格替换(依据开始列确定)头文件必须使用保护宏,防止文件被重复包含。混合C/C+接口头文件用extern C 包含C语言定义。为了使预编译头机制在Visual C+中工作正常,源文件必须在其它头文件前包含precomp.h头文件。,OpenCV概述,OpenCV编码样式:3、命名约定OpenCV中使用大小写混合样式来标识外部函数、数据类
8、型和类方法。宏全部使用大写字符,词间用下划线分隔。所有的外部或内部名称,若在多个文件中可见,则必须含有前缀:外部函数使用前缀cv 内部函数使用前缀Icv 数据结构(C结构体、枚举、联合体、类)使用前缀Cv 外部或某些内部宏使用前缀CV_ 内部宏使用前缀ICV_,OpenCV概述,OpenCV编码样式:4、函数接口设计:为了保持库的一致性,以如下方式设计接口非常重要。函数接口元素包括:功能 名称 返回值 参数类型 参数顺序 参数默认值 函数功能必须定义良好并保持精简。函数应该容易镶入到使用其它OpenCV函数的不同处理过程。函数名称应该简单并能体现函数的功能。大多数函数名形式:cv,OpenCV
9、概述,通道的概念:独立的颜色平面 可简单理解为表示一个像素需要几个元素 1通道:描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道,为1。2通道:2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便;还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。3通道:如果一个像素点,由RGB三种颜色来描述它,就是三通道,为3。4通道:windows的bmp有时候
10、是一个四通道图像,R、G、B加上一个A通道,一般叫做alpha通道,表示透明度。,OpenCV概述,ROI的概念:ROI在opencv中是指Region of interest,感兴趣的区域的意思。COI的概念:COI是Channel of interest的意思。在计算机表示图像的时候,是按RGBAplfa来表示一个像素的。每个R,G,B,Alfa都是一个Channel.Region是指图像中的某一部分。,OpenCV基本数据类型和数据结构,基本数据类型:点:CvPoint、CvPoint2D32f、CvPoint3D32f 矩形框大小:CvSize、CvSize2D32f 矩形框:CvRe
11、ct 可以存放1-4个数值的数组:CvScalar 定义迭代算法的终止规则:CvTermCriteria 矩阵:CvMat、CvMatND、CvSparseMat IPL图像头部:IplImage 定义不确定的数组:CvArr(仅作函数参数),OpenCV基本数据类型和数据结构,点数据结构:CvPoint 二维坐标系下的点,类型为整型 typedef struct CvPoint int x;/*X坐标,通常以0为基点*/int y;/*y坐标,通常以0为基点*/CvPoint;/*构造函数*/inline CvPoint cvPoint(int x,int y);/*从 CvPoint2D3
12、2f类型转换得来*/inline CvPoint cvPointFrom32f(CvPoint2D32f point)CvPoint2D32f:二维坐标下的点,类型为浮点CvPoint3D32f:三维坐标下的点,类型为浮点,OpenCV基本数据类型和数据结构,矩形数据结构:CvSize 矩形框大小,以像素为精度 typedef struct CvSizeint width;/*矩形宽*/int height;/*矩形高*/CvSize;/*构造函数*/inline CvSize cvSize(int width,int height);CvSize2D32f,OpenCV基本数据类型和数据结构
13、,矩形数据结构: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);,OpenCV基本数据类型和数据结构,矩阵数据结构:typedef struct CvMat int type;/*CvMat 标识(CV_MAT_MAGIC_VAL),元素类型和标记*/int step;/*以字
14、节为单位的行数据长度*/int*refcount;/*数据引用计数*/union uchar*ptr;short*s;int*i;float*fl;double*db;data;/*data 指针*/#ifdef _cplusplus union int rows;int height;union int cols;int width;#else int rows;/*行数*/int cols;/*列数*/#endif CvMat;,OpenCV基本数据类型和数据结构,矩阵数据结构:int type;矩阵通用矩阵数据类型:CV_(S|U|F)CS:带符号整数U:无符号整数F:浮点数。例:CV_
15、8UC1:8位无符号单通道矩阵;CV_32FC2:32位浮点数双通道矩阵。,OpenCV基本数据类型和数据结构,矩阵数据结构:int*refcount;数据引用计数 refcount=NULL:矩阵的数据区为外部数据,不需释放 refcount!=NULL:需要释放矩阵头和数据区。int step;以字节为单位的行数据长度是定位元素所需要的行信息,OpenCV基本数据类型和数据结构,矩阵数据结构:union uchar*ptr;short*s;int*i;float*fl;double*db;data;指向数据区首地址的指针。指针是公用体结构,使用时要根据矩阵的数据类型选择。,OpenCV基本
16、数据类型和数据结构,图像头结构:IplImage:IPL 图像头typedef struct _IplImage int nSize;/*IplImage大小*/int ID;/*版本(=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
17、colorModel4;char channelSeq4;/*被OpenCV忽略*/int dataOrder;/*0-交叉存取颜色通道,1-分开的颜色通道.cvCreateImage只能创建交叉存取图像*/int origin;/*0-顶左结构,1-底左结构(BMP风格)*/int align;/*图像行排列(4 or 8).OpenCV 用widthStep 代替*/,OpenCV基本数据类型和数据结构,图像头结构:int width;/*图像宽像素数*/int height;/*图像高像素数*/struct _IplROI*roi;/*图像感兴趣区域.当该值非空只对该区域进行处理*/st
18、ruct _IplImage*maskROI;/*在 OpenCV中必须置NULL*/void*imageId;/*同上*/struct _IplTileInfo*tileInfo;/*同上*/int imageSize;/*图像数据大小,单位字节*/char*imageData;/*指向排列的图像数据*/int widthStep;/*排列的图像行大小,以字节为单位*/int BorderMode4;int BorderConst4;/*边际结束模式,被忽略*/char*imageDataOrigin;/*指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的*/IplImage;,O
19、penCV基本数据类型和数据结构,图像头结构:IplImage结构来自于 Intel Image Processing Library。OpenCV 只支持其中的一个子集:alphaChannel 在OpenCV中被忽略。colorModel 和channelSeq 被OpenCV忽略。dataOrder 必须是IPL_DATA_ORDER_PIXEL(颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。不支持maskROI。处理MASK的函数把他当作一个分离的参数。
20、MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。tileInfo 不支持。BorderMode和BorderConst是不支持的。OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或 ROI的尺寸必须精确匹配。,OpenCV基本数据类型和数据结构,图像头结构:int depth;图像通用数据类型:IPL_DEPTH_(S|U|F)S、U、F的意义同矩阵数据类型。例:IPL_DEPTH_8U:8位无符号整数图像 IPL_DEPTH_32F:32位浮点数图像int nChannels;图像的通道数例:灰度图为1个通道复值图像为2个通道RGB图像为3个通道RG
21、BA图像为4个通道(A通道即阿尔法通道,下去查资料了解)大多数OpenCV函数支持14个通道,OpenCV基本数据类型和数据结构,图像头结构:int dataOrder;图像数据的存储格式 0:交叉存取颜色通道 1:分开存取颜色通道OpenCV函数只支持交叉存取的图像。int widthStep;排列的图像行长度,以字节为单位 与矩阵结构中的step成员相似,OpenCV基本数据类型和数据结构,图像头结构:struct _IplROI*roi;ROI:Region Of Interest(感兴趣区域)roi=NULL:整幅图像参与运算roi!=NULL:ROI区域代替图像参加运算ROI的操作:
22、cvSetImageROI():设置ROI区域cvResetImageROI():取消ROI区域cvGetImageROI():得到ROI区域,OpenCV基本数据类型和数据结构,图像头结构:int origin;图像像素的起始方式origin=0:顶-左结构origin=1:底-左结构(windows风格)char*imageData;图像的数据区char*类型而非unsigned char*类型,进行浮点处理时可能要加到unsigned char的转换,否则会导致结果不正常。,OpenCV基本数据类型和数据结构,不确定数组:CvArr:不确定数组只用作函数的参数 表示可接受多种类型的输入形
23、式(矩阵等)运行时通过分析数组头的前4个字节来判断大多数CvArr*做输出参数的情况下,函数是对CvArr的结构进行写入操作而不是返回指针,OpenCV基本操作,矩形操作:创建矩阵 CreateMatCvMat*cvCreateMat(int rows,int cols,int type);Rows 矩阵行数,cols 矩阵列数。Type 矩阵元素类型。通常以 CV_(S|U|F)C型式描述,例如:CV_8UC1 意思是一个8-bit 无符号单通道矩阵,CV_32SC2 意思是一个32-bit 有符号二个通道的矩阵。函数 cvCreateMat 为新的矩阵分配头和下面的数据,并且返回一个指向新
24、创建的矩阵的指针。矩阵按行存贮。所有的行以4个字节对齐。删除矩阵 ReleaseMat void cvReleaseMat(CvMat*mat);例如:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvReleaseMat(,OpenCV基本操作,矩形操作:复制矩阵CloneMat:CvMat*cvCloneMat(const CvMat*mat);例如:CvMat*M1=cvCreateMat(4,4,CV_32FC1);CvMat*M2;M2=cvCloneMat(M1);初始化矩阵方法1:用cvMat初始化 double a=1,2,3,4,5,6,7,8,9,10
25、,11,12;CvMat Ma=cvMat(3,4,CV_64FC1,a);方法2:用cvCreateMatHeader初始化 CvMat Ma;cvInitMatHeader(,OpenCV基本操作,矩形操作:访问矩阵元素(1)直接访问cvmSet(M,i,j,2,0);/Set M(i,j)t=cvmGet(M,i,j);/Get M(i,j)(2)已知对齐方式的直接访问CvMat*M=cvCreateMat(4,4,CV_32FC1);int n=M-cols;float*data=M-data.fl;datai*n+j=3.0;/假设32位对齐(3)未知对齐方式的直接访问CvMat*M
26、=cvCreateMat(4,4,CV_32FC1);int step=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
27、-MccvAddS(Ma,cvScalar(-10.0),Mc);/Ma.-10-Mc单个矩阵的操作cvTranspose(Ma,Mb);/transpose(Ma)-MbCvScalar t=cvTrace(Ma);/trace(Ma)-t.val0double d=cvDet(Ma);/det(Ma)-dcvInvert(Ma,Mb);/inv(Ma)-Mb,OpenCV基本操作,矩形操作:矩阵间的操作向量乘法,假设Va,Vb,Vc均为n元素向量double res=cvDotProduct(/A=UDVT标志使U和V以转置方式返回非齐次线性系统的求解假设A为n*n方阵,x,b均为n元素向
28、量cvSolve(&A,&b,&x),OpenCV基本操作,矩形操作:实例:矩形乘法、DCT变换、反变换-matrix,OpenCV基本操作,图形界面操作:与windows程序设计有许多类似之处创建一个有名字的窗口:cvNamedWindow(window_name,fixed_size_flag)cvNamedWindow(window_name,x,y)销毁窗口:cvDestroyWindow(window_name)操作函数很多,可根据函数名大致判断其功能cvNamedWindow(“ViewA”,1);(CV_WINDOW_AUTOSIZE=1)cvMoveWindow(ViewA,3
29、00,100);cvDestroyWindow(ViewA);cvShowImage(window_name,image);,OpenCV基本操作,交互操作:等待按键cvWaitKeyint cvWaitKey(int delay=0)如果delay=0,则无限等待,否则等待delay毫秒则返回在程序循环中,有时候由于程序一直处于计算中,窗口无法重新恢复(如读出视频中的所有帧并显示),可以加入cvWaitKey,使之等待几毫秒,让窗口完成重新绘制再执行其他操作。其它交互函数,OpenCV基本操作,图像操作:创建头并分配数据 CreateImageIplImage*cvCreateImage(C
30、vSize size,int depth,int channels);size:图像宽、高.depth:图像元素的位深度,IPL_DEPTH_8U|8S|16U|16S|32S|32F|64F channels:每个元素(像素)的颜色通道数量.可以是 1,2,3 或 4.释放头和图像数据 ReleaseImagevoid cvReleaseImage(IplImage*image);复制图像 CloneImageIplImage*cvCloneImage(const IplImage*image);,OpenCV基本操作,图像操作:头分配CreateImageHeaderIplImage*cv
31、CreateImageHeader(CvSize size,int depth,int channels)初始化被用图分配的图像头 InitImageHeaderIplImage*cvInitImageHeader(IplImage*image,CvSize size,int depth,int channels,int origin=0,int align=4);origin IPL_ORIGIN_TL 或 IPL_ORIGIN_BL.align 图像行排列,典型的 4 或 8 字节.函数 cvInitImageHeader 初始化图像头结构,指向用户指定的图像并且返回这个指针。释放头 Re
32、leaseImageHeadervoid cvReleaseImageHeader(IplImage*image);,OpenCV基本操作,图像操作:从文件读图像cvLoadImageIplImage*cvLoadImage(char*fileName,int flag=1)OpenCV支持的图像格式:BMP、DIB、JPG、PNG、PBM、PGM、PPM、SR、RAS和TIFF写图像到文件cvSaveImageIplImage*cvSaveImage(char*fileName,IplImage*img)图像转换cvConvertImage(IplImage*src,IplImage*dst
33、,int flags=0);/灰度图彩色图cvCvtColor(IplImage*src,IplImage*dst,int code);/彩色图彩色图/灰度图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*cvCa
34、ptureFromAVI(inflie.avi);捕捉某一帧 cvGrabFrame(capture)/抓住一帧,为快速遍历视频帧 IplImage*img=cvRetrieveImage(capture);/把Grab的帧取出,或 IplImage*cvQueryFrame(capture);释放捕捉源cvReleaseCapture(,OpenCV基本操作,视频操作:保存视频文件typedef struct CvVideoWriter;CvVideoWriter*cvCreateVideoWriter(const char*filename,int fourcc,double fps,Cv
35、Size frame_size,int is_color=1);int cvWriteFrame(CvVideoWriter*writer,const IplImage*image);void cvReleaseVideoWriter(CvVideoWriter*writer);,OpenCV基本操作,视频操作:获取/设置视频帧信息cvGetCaptureProperty(capture,property_id);cvSetCaptureProperty(capture,property_id,value);CV_CAP_PROP_POS_MSEC-video capture timestam
36、pCV_CAP_PROP_POS_FRAMES-0-based index of the frame CV_CAP_PROP_POS_AVI_RATIO-relative position of video(0-start,1-end)CV_CAP_PROP_FRAME_WIDTH-width of frames in the video streamCV_CAP_PROP_FRAME_HEIGHT-height of frames in the video streamCV_CAP_PROP_FPS-frame rateCV_CAP_PROP_FOURCC-4-character code
37、of codec CV_CAP_PROP_FRAME_COUNT-number of frames in video file,OpenCV基本操作,视频操作:实例一:边缘检测-laplace实例二:背景提取-foregroundcapture,OpenCV基本操作,内存操作:内存相关结构体及函数 CvMemBlock内存存储块结构 typedef struct CvMemBlock struct CvMemBlock*prev;struct CvMemBlock*next;CvMemBlock;这是OpenCV所管理的基本的内存块,代表一个单独的内存存储块结构,一个双向的循环链表。,Open
38、CV基本操作,内存操作:内存相关结构体及函数 CvMemStoragePos内存存储块地址 typedef struct CvMemStorage struct CvMemBlock*bottom;/*first allocated block*/struct CvMemBlock*top;/*top of the stack*/struct CvMemStorage*parent;/*new blocks from*/int block_size;/*block size*/int free_space;/*free space in the top block(in bytes)*/CvM
39、emStorage;一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块(CvMemBlock)构成,呈列表型。存储器就如同栈,bottom指向栈底,top指向栈顶。,OpenCV基本操作,内存操作:内存相关结构体及函数 CreateMemStorage创建内存块 CvMemStorage*cvCreateMemStorage(int block_size=0);block_size:存储块的大小以字节表示。若大小是0byte,则将该块设置成默认值64k。该函数创建一内存块并返回指向块首的指针。起初,存储块是空的。CreateChildMemS
40、torage创建子内存块 CvMemStorage*cvCreateChildMemStorage(CvMemStorage*parent);parent:父内存块该函数创建一类似于普通内存块的子内存块,除了内存分配/释放机制不同外,新的块一般是从parent那得到,OpenCV基本操作,内存操作:内存相关结构体及函数 ReleaseMemStorage释放内存块 void cvReleaseMemStorage(CvMemStorage*storage);storage:指向被释放了的存储块的指针该函数释放所有的存储块,或将它们返回给各自的parent。接下来再释放header块并清除指向该
41、块的指针。在释放parent块之前,先清除各自的child块。ClearMemStorage清空内存存储块 void cvClearMemStorage(CvMemStorage*storage);storage:存储存储块该函数并不释放内存(仅清空内存)。假使该内存块有一个父内存块(即:存在一内存块与其有父子关系),则函数就将所有的块返回给其parent.,OpenCV基本操作,内存操作:其它内存操作:除了上面介绍的直接进行内存操作的函数外,还有一些函数在使用时需要注意内存泄漏问题,在创建完一个对象后,一定要记得释放对象所占用的那部分内存。以下列出了需要注意内存释放的函数,使用时应该成对出现
42、。/创建并释放图像数据cvCreateImagecvReleaseImage/创建并释放图像头 cvCreateImageHeader cvReleaseImageHeader,OpenCV基本操作,内存操作:其它内存操作:/创建并释放矩阵 cvCreateMat cvReleaseMat/创建并释放多维密集数组 cvCreateMatND cvReleaseMatND/分配并释放数组数据 cvCreateData cvReleaseData/创建并释放稀疏数组 cvCreateSparseMat cvReleaseSparseMat,OpenCV基本操作,综合实例演示:车牌识别,课堂练习,图像操作:1、用OpenCV实现显示一副图像加载图像、定义显示窗口、显示图像2、用OpenCV实现两幅图像相加/相减,并显示相加/相减后得到的图像图像相加函数:void cvAdd(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL)相减函数:cvSub(cvAdd(const CvArr*src1,const CvArr*src2,CvArr*dst,const CvArr*mask=NULL),课程总结,冰山一角资料推荐,欢迎加入虚拟现实团队!谢谢大家!,