学习材料OpenCVppt课件

上传人:s9****2 文档编号:586315180 上传时间:2024-09-04 格式:PPT 页数:116 大小:5.44MB
返回 下载 相关 举报
学习材料OpenCVppt课件_第1页
第1页 / 共116页
学习材料OpenCVppt课件_第2页
第2页 / 共116页
学习材料OpenCVppt课件_第3页
第3页 / 共116页
学习材料OpenCVppt课件_第4页
第4页 / 共116页
学习材料OpenCVppt课件_第5页
第5页 / 共116页
点击查看更多>>
资源描述

《学习材料OpenCVppt课件》由会员分享,可在线阅读,更多相关《学习材料OpenCVppt课件(116页珍藏版)》请在金锄头文库上搜索。

1、数字媒体技术基础课程 (04831800) (Fundamental of Digital Media Technology)OpenCV自学材料 田永鸿北京大学数字媒体研究所本科生核心专业课程:数字媒体技术基础(04831800)第一部分oOpenCV概述o基础结构与操作o基本OpenCV程序与示例o注:本讲义中部分代码来自OpenCV样例,部分代码来自OpenCV教程基础篇,部分代码则从网上收集。2本科生核心专业课程:数字媒体技术基础(04831800)OpenCV概述oOpenCV是Intel开源计算机视觉库。o它由一系列 C 函数和少量 C+ 类构成,实现了图像处理和计算机视觉方面的很

2、多通用算法。oOpenCV 的特点n拥有包括 300 多个C函数的跨平台的中、高层 APIn跨平台:Windows, Linuxn免费(FREE):无论对非商业应用和商业应用 n速度快n使用方便3本科生核心专业课程:数字媒体技术基础(04831800)4OpenCV structureCXCOREbasic structures and algoritms,XML support, drawing functionsCVImage processingand visionHighGUIGUI, Image and Video I/OMLMachine Learning algorithmsCV

3、Camvideo stream processing本科生核心专业课程:数字媒体技术基础(04831800)The Functionality in Pictures本科生核心专业课程:数字媒体技术基础(04831800)OpenCV的下载与安装o1、下载地址 http:/ http:/ 2003下的安装与配置参见http:/ MSVS .net 2k3Create a Win32 Console ProjectMake it an Empty Project by selecting the box under Application SettingsA project is initial

4、ly created by selecting:File - New - ProjectCreating the Project本科生核心专业课程:数字媒体技术基础(04831800)Configuring MSVS .net 2k3Right Click the Source Files Folder under the project name (Tutorial in this case)Add - Add new ItemCreate the First FileSelect C+ file and give it a nameCreating a file makes it poss

5、ible to set Additional Include Directives in the C/C+ pane under the project properties.本科生核心专业课程:数字媒体技术基础(04831800)Configuring MSVS .net 2k3In order to build projects using OpenCV the required libraries and directives must be included in the projects propertiesRight Click the name of the project an

6、d select Properties (Tutorial in this case)Open the Properties Pane本科生核心专业课程:数字媒体技术基础(04831800)Configuring MSVS .net 2k3Under the C/C+ tab select GeneralSet Additional Include DirectivesSelect the Additional Include DirectivesAdd the full path to each of the folders which contain .h files required t

7、o use OpenCVBe sure to include trailing C:Program FilesOpenCVcvauxincludeC:Program FilesOpenCVcxcoreincludeC:Program FilesOpenCVcvincludeC:Program FilesOpenCVotherlibshighguiC:Program FilesOpenCVotherlibscvcaminclude Utilized Directives本科生核心专业课程:数字媒体技术基础(04831800)Configuring MSVS .net 2k3Under the L

8、inker tab select InputSet Additional DependenciesSelect the Additional DependenciesC:Program FilesOpenCVlibcv.libC:Program FilesOpenCVlibcvaux.libC:Program FilesOpenCVlibcxcore.libC:Program FilesOpenCVlibcvcam.libC:Program FilesOpenCVlibhighgui.libUtilized DependenciesAdd the full path to each of th

9、e .lib files required to use OpenCVBe sure to keep the paths in quotes本科生核心专业课程:数字媒体技术基础(04831800)Testing MSVS .net 2k3Now that the environment is configured it would be a good idea to test it to make sure that a program will correctly build and run.#include #include /*This will pop up a small box w

10、ith Hello World as the text.*/int main( int argc, char* argv ) /declare for the height and width of the image int height = 320; int width = 240; /specify the point to place the text CvPoint pt = cvPoint( height/4, width/2 ); /Create an 8 bit, 3 plane image IplImage* hw = cvCreateImage(cvSize(height,

11、 width), 8, 3); /initialize the font CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); /place the text on the image using the font cvPutText(hw, Hello World, pt, &font, CV_RGB(150, 0, 0) ); /create the window container cvNamedWindow(Hello World, 0); /display the image i

12、n the container cvShowImage(Hello World, hw); /hold the output windows cvWaitKey(0); return 0;The enclosed code can be cut and pasted into the file created in the project space to test OpenCVTesting the First Program本科生核心专业课程:数字媒体技术基础(04831800)Testing MSVS .net 2k3Output of ProgramThe program is bui

13、lt by selecting:Build - Build SolutionOr by pressing F7Building the ProgramThe program is run by selecting:Debug - Start|Start without DebuggingOr by pressing F5 or -F5Running the Program本科生核心专业课程:数字媒体技术基础(04831800)OpenCV 编码样式指南o1、文件命名:有cv和cvaux库文件的命名必须服从于以下规则: n所有的CV库文件名前缀为cv n混合的C/C+接口头文件扩展名为 .h n

14、纯C+接口头文件扩展名为 .hpp n实现文件扩展名为 .cpp n为了与POSIX兼容,文件名都以小写字符组成14本科生核心专业课程:数字媒体技术基础(04831800)OpenCV 编码样式指南o2、文件结构n每个文件以BSD兼容的许可声明(模板在Contributors_BSD_Licsense.htm文件中可以找到)开头;n一行最多90个字符,不包括行结束符 n不使用制表符 n缩进为4个空格符,所以制表符应该用1-4个空格替换(依据开始列确定) n头文件必须使用保护宏,防止文件被重复包含。n混合C/C+接口头文件用extern C 包含C语言定义。n为了使预编译头机制在Visual C

15、+中工作正常,源文件必须在其它头文件前包含precomp.h头文件。15本科生核心专业课程:数字媒体技术基础(04831800)OpenCV 编码样式指南o3、命名约定nOpenCV中使用大小写混合样式来标识外部函数、数据类型和类方法。n宏全部使用大写字符,词间用下划线分隔。n所有的外部或内部名称,若在多个文件中可见,则必须含有前缀: 外部函数使用前缀cv 内部函数使用前缀Icv 数据结构(C结构体、枚举、联合体、类)使用前缀Cv 外部或某些内部宏使用前缀CV_ 内部宏使用前缀ICV_ 16本科生核心专业课程:数字媒体技术基础(04831800)OpenCV 编码样式指南o4、函数接口设计:为

16、了保持库的一致性,以如下方式设计接口非常重要。函数接口元素包括: 功能 名称 返回值 参数类型 参数顺序 参数默认值 o函数功能必须定义良好并保持精简。函数应该容易镶入到使用其它OpenCV函数的不同处理过程。函数名称应该简单并能体现函数的功能。大多数函数名形式:cv17本科生核心专业课程:数字媒体技术基础(04831800)18A Simple OpenCV Program1. #include 2. #include 3. #include 4. int main( int argc, char* argv ) 5. CvPoint center;6. double scale=-3;7.

17、 IplImage* image = argc=2 ? cvLoadImage(argv1) : 0;8. if(!image) return -1;9. center = cvPoint(image-width/2,image-height/2);10. for(int i=0;iheight;i+)11. for(int j=0;jwidth;j+) 12. double dx=(double)(j-center.x)/center.x;13. double dy=(double)(i-center.y)/center.y;14. double weight=exp(dx*dx+dy*dy

18、)*scale);15. uchar* ptr = &CV_IMAGE_ELEM(image,uchar,i,j*3);16. ptr0 = cvRound(ptr0*weight);17. ptr1 = cvRound(ptr1*weight);18. ptr2 = cvRound(ptr2*weight); 19. cvSaveImage(copy.png, image );20. cvNamedWindow( test, 1 );21. cvShowImage( test, image );22. cvWaitKey();23. return 0; 本科生核心专业课程:数字媒体技术基础(

19、04831800)基本数据结构o点:CvPoint 、CvPoint2D32f、CvPoint3D32f o矩形框大小:CvSize 、CvSize2D32f o矩形框:CvRect o可以存放1-4个数值的数组:CvScalar o定义迭代算法的终止规则:CvTermCriteria o矩阵:CvMat 、CvMatND 、CvSparseMat oIPL图像头部:IplImage o定义不确定的数组:CvArr (仅作函数参数)19本科生核心专业课程:数字媒体技术基础(04831800)点数据结构oCvPoint 二维坐标系下的点,类型为整型 typedef struct CvPoint

20、int x; /* X坐标, 通常以0为基点 */int y; /* y坐标, 通常以0为基点 */CvPoint;/* 构造函数 */inline CvPoint cvPoint( int x, int y );/* 从 CvPoint2D32f类型转换得来 */inline CvPoint cvPointFrom32f( CvPoint2D32f point )oCvPoint2D32f :二维坐标下的点,类型为浮点oCvPoint3D32f :三维坐标下的点,类型为浮点20本科生核心专业课程:数字媒体技术基础(04831800)矩形框大小数据结构oCvSize 矩形框大小,以像素为精度

21、typedef struct CvSizeint width; /* 矩形宽 */int height; /* 矩形高 */CvSize;/* 构造函数 */inline CvSize cvSize( int width, int height );oCvSize2D32f 21本科生核心专业课程:数字媒体技术基础(04831800)矩形框数据结构oCvRect 矩形框的偏移和大小 typedef struct CvRectint x; /* 方形的最左角的x-坐标 */int y; /* 方形的最上或者最下角的y-坐标 */int width; /* 宽 */int height; /* 高

22、 */CvRect;/* 构造函数*/inline CvRect cvRect(int x, int y, int width, int height);22本科生核心专业课程:数字媒体技术基础(04831800)矩阵数据结构oCvMat 二维矩阵 typedef struct CvMat int type; /* CvMat 标识, 元素类型和标记 */int step; /* 以字节为单位的行数据长度*/int rows; /*行数*/int cols; /*列数*/ int* refcount; /* 数据引用计数 */unionuchar* ptr;short* s;int* i;fl

23、oat* fl;double* db; data; /* data 指针 */ 23本科生核心专业课程:数字媒体技术基础(04831800)矩阵数据结构oCvMatND:多维、多通道密集数组 oCvSparseMat:多维、多通道稀疏数组oCvArr:不确定数组24本科生核心专业课程:数字媒体技术基础(04831800)图像头数据oIplImage:IPL 图像头25本科生核心专业课程:数字媒体技术基础(04831800)图像头数据oIplImage:IPL 图像头typedef struct _IplImage int nSize; /* IplImage大小 */int ID; /* 版本

24、 (=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; char channelSeq4; /* 被OpenCV忽略 */int dataOrder; /* 0 - 交叉存取颜色通道,

25、1 - 分开的颜色通道.cvCreateImage只能创建交叉存取图像 */int origin; /* 0 - 顶左结构,1 - 底左结构 (BMP风格) */int align; /* 图像行排列 (4 or 8). OpenCV 用widthStep 代替 */ 26本科生核心专业课程:数字媒体技术基础(04831800)int width; /* 图像宽像素数 */int height; /* 图像高像素数*/struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */struct _IplImage *maskROI; /* 在 OpenCV中必

26、须置NULL */void *imageId; /* 同上*/struct _IplTileInfo *tileInfo; /*同上*/int imageSize; /* 图像数据大小,单位字节*/char *imageData; /* 指向排列的图像数据 */int widthStep; /* 排列的图像行大小,以字节为单位 */int BorderMode4; int BorderConst4; /* 边际结束模式, 被忽略*/char *imageDataOrigin; /* 指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的 */IplImage;27本科生核心专业课程:数字

27、媒体技术基础(04831800)图像头数据oIplImage结构来自于 Intel Image Processing Library。OpenCV 只支持其中的一个子集: nalphaChannel 在OpenCV中被忽略。ncolorModel 和channelSeq 被OpenCV忽略。ndataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。nalign 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。n不支持maskROI 。处理MASK的函数把他当作一

28、个分离的参数。MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。ntileInfo 不支持。nBorderMode和BorderConst是不支持的。nOpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或 ROI的尺寸必须精确匹配。28本科生核心专业课程:数字媒体技术基础(04831800)基本OpenCV操作o矩阵的使用与操作oGUI命令o图像的使用与操作o视频的使用与操作本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作(1)o创建矩阵 CreateMatCvMat* cvCreateMat( int rows, int cols

29、, int type );nrows 矩阵行数。 cols 矩阵列数。 type 矩阵元素类型。 通常以 CV_(S|U|F)C型式描述, 例如: CV_8UC1 意思是一个8-bit 无符号单通道矩阵, CV_32SC2 意思是一个32-bit 有符号二个通道的矩阵。 n函数 cvCreateMat 为新的矩阵分配头和下面的数据,并且返回一个指向新创建的矩阵的指针。矩阵按行存贮。所有的行以4个字节对齐。o删除矩阵 ReleaseMat void cvReleaseMat( CvMat* mat );n例如:CvMat* M = cvCreateMat( 4, 4, CV_32FC1); cv

30、ReleaseMat( &M);30本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作(2)o复制矩阵CloneMatCvMat* cvCloneMat( const CvMat* mat );n例如: CvMat* M1 = cvCreateMat( 4, 4, CV_32FC1);CvMat* M2;M2 = cvCloneMat(M1);o初始化矩阵n方法1:用cvMat初始化 double a = 1, 2, 3, 4,5, 6, 7, 8,9, 10, 11, 12 ; CvMat Ma = cvMat( 3, 4, CV_64FC1, a);n方法2:用cvC

31、reateMatHeader初始化 CvMat Ma; cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a);o初始化单位矩阵nCvMat* M = cvCreateMat( 4, 4, CV_32FC1);cvSetIdentity(M);31本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作(3)o访问矩阵元素n(1)直接访问cvmSet(M, i, j, 2, 0); /Set M(i,j)t = cvmGet(M, i, j); /Get M(i,j)n(2)已知对齐方式的直接访问CvMat* M = cvCreateMat( 4, 4

32、, CV_32FC1); int n = M-cols;float *data = M-data.fl;datai*n+j = 3.0; /假设32位对齐n(3)未知对齐方式的直接访问CvMat* M = cvCreateMat( 4, 4, CV_32FC1); int step = M-step/sizeof(float);float *data = M-data.fl;(data + i*step)j = 3.0;n(4)直接访问一个已初始化的矩阵Mai*4 + j = 2.0;32本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作(4)o矩阵间的操作CvMat *

33、Ma, *Mb, *Mc;ncvAdd(Ma, Mb, Mc); /Ma + Mb - McncvSub(Ma, Mb, Mc); /Ma - Mb - McncvMatMul(Ma, Mb, Mc); /Ma * Mb - Mco矩阵元素间的操作ncvMul(Ma, Mb, Mc); /Ma. * Mb - McncvDiv(Ma, Mb, Mc); /Ma. / Mb - McncvAddS(Ma, cvScalar(-10.0), Mc); /Ma. -10 - Mco单个矩阵的操作ncvTranspose(Ma, Mb); /transpose(Ma) - MbnCvScalar t=

34、cvTrace(Ma); /trace(Ma) -t.val0ndouble d = cvDet(Ma); /det(Ma) -dncvInvert(Ma, Mb); /inv(Ma) -Mb33本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作(5)o向量乘法假设Va, Vb, Vc均为n元素向量ndouble res = cvDotProduct(&Va, &Vb); /Va Vb - resncvCrossProduct(&Va, &Vb , &Vc); / Va Vb - Vco矩阵特征值分解假设A, E均为n*n方阵,I为n元素向量ncvEigenVV(&A,

35、&E , &I); oSVD 假设A, U, D, V均为n*n方阵ncvSVD(A, D, U, V, CV_SVD_U_T| CV_SVD_V_T); /A=UDVT标志使U和V以转置方式返回o非齐次线性系统的求解假设A为n*n方阵,x,b均为n元素向量ncvSolve(&A, &b, &x)34本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作:示例(1)#include cv.h#include highgui.h#include void PrintMat(CvMat *A); / 显示矩阵void Test_Multiply(); / 测试矩阵乘法void T

36、est_DCT(); / 计算DCT变换int main() Test_Multiply(); Test_DCT(); return 0;35本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作:示例(2)void PrintMat(CvMat* A) / 显示矩阵int i,j;for(i=0;irows;i+) printf(n); switch( CV_MAT_DEPTH(A-type) ) case CV_32F: case CV_64F: for(j=0; jcols; j+) printf(%9.3f , (float) cvGetReal2D( A, i, j

37、 ); break; case CV_8U: case CV_16U: for(j=0;jcols;j+) printf(%6d,(int)cvGetReal2D( A, i, j ); break; default: break; printf(n);36本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作:示例(3)void Test_Multiply()/ Test matrix multiply double a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; double b = 1, 5, 9, 2, 6, 10, 3, 7,

38、 11, 4, 8, 12 ; double c9; CvMat Ma, Mb, Mc; printf(n= Test multiply =); cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP ); cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP ); cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP ); cvMatMulAdd( &Ma, &Mb, 0, &Mc ); PrintMat(&Ma); PrintMat(&M

39、b); PrintMat(&Mc); return;37本科生核心专业课程:数字媒体技术基础(04831800)矩阵的使用与操作:示例(4)void Test_DCT()/ test 1-d and 2-d dct transform float data = 1, 2, 3, 4, 5, 6, 7, 8 ; CvMat a; a = cvMat(2,4,CV_32FC1,data); printf(n= Test DCT =); printf(nOriginal matrix = ); PrintMat(&a); cvDCT(&a, &a, CV_DXT_FORWARD); printf(n

40、2-D DCT = ); PrintMat(&a); cvDCT(&a, &a, CV_DXT_INVERSE); printf(n2-D IDCT = ); PrintMat(&a);38本科生核心专业课程:数字媒体技术基础(04831800)Discrete Cosine Transform(DCT)Transform kernel of two-dimensional DCT iswhereClearly, the kernel for the DCT is both separable and symmetric, and hence the DCT may be implemente

41、d as a series of one dimensional DCTs.39本科生核心专业课程:数字媒体技术基础(04831800)Discrete Cosine Transform(DCT)Forward transform and Inverse transformwhere u, v, x, y = 0, 1, 2, , N-140本科生核心专业课程:数字媒体技术基础(04831800)Transform Matrix of DCTwhere:41本科生核心专业课程:数字媒体技术基础(04831800)Example of DCT42本科生核心专业课程:数字媒体技术基础(048318

42、00)DCT的几点说明DCT变换避免了复数运算。由于图像矩阵是实数矩阵,那么它的DCT也是实数DCT是正交变换,其变换矩阵是正交阵,变换核是可分离的。DCT有快速算法DCT与IDCT具有相同的变换核,因此具有相同的变换矩阵,即正变换与逆变换公用同一个算法模块DCT具有更强的信息集中能力,能将最多的信息放到最小的系数上去。Dr. JI ZHEN43本科生核心专业课程:数字媒体技术基础(04831800)HighGUI操作oSmart windowsoImage I/O, renderingoProcessing keyboard and other events, timeoutsoTrackb

43、arsoMouse callbacksoVideo I/O44本科生核心专业课程:数字媒体技术基础(04831800)WindowsocvNamedWindow(window_name, fixed_size_flag)cvNamedWindow(window_name, x, y)cvDestroyWindow(window_name)ncreates window accessed by its name. Window handles repaint, resize events. Its position is remembered in registry.ncvNamedWindow

44、(ViewA,1);ncvMoveWindow(ViewA,300,100);ncvDestroyWindow(ViewA);nocvShowImage(window_name, image);ncopies the image to window buffer, then repaints it when necessary. 8u|16s|32s|32fC1|3|4 are supported.nonly the whole window contents can be modified. Dynamic updates of parts of the window are done us

45、ing operations on images, drawing functions etc.45本科生核心专业课程:数字媒体技术基础(04831800)Windowso等待按键cvWaitKeyint cvWaitKey( int delay=0 )n如果delay=0, 则无限等待,则等待delay毫秒则返回n在程序循环中,有时候由于程序一直处于计算中,窗口无法重新恢复(如读出视频中的所有帧并显示),可以加入cvWaitKey,使之等待几毫秒,让窗口完成重新绘制再执行其他操作46本科生核心专业课程:数字媒体技术基础(04831800)图像的使用与操作(1)o创建头并分配数据 Create

46、ImageIplImage* cvCreateImage( CvSize size, int depth, int channels );size:图像宽、高. depth:图像元素的位深度,IPL_DEPTH_8U|8S|16U|16S|32S|32F|64F channels:每个元素(像素)的颜色通道数量.可以是 1, 2, 3 或 4.o释放头和图像数据 ReleaseImagevoid cvReleaseImage( IplImage* image );o复制图像 CloneImageIplImage* cvCloneImage( const IplImage* image );47

47、本科生核心专业课程:数字媒体技术基础(04831800)图像的使用与操作(2)o头分配CreateImageHeaderIplImage* cvCreateImageHeader( CvSize size, int depth, int channels )o初始化被用图分配的图像头 InitImageHeaderIplImage* cvInitImageHeader( IplImage* image, CvSize size, int depth,int channels, int origin=0, int align=4 );origin IPL_ORIGIN_TL 或 IPL_ORIG

48、IN_BL. align 图像行排列, 典型的 4 或 8 字节. 函数 cvInitImageHeader 初始化图像头结构, 指向用户指定的图像并且返回这个指针。o释放头 ReleaseImageHeadervoid cvReleaseImageHeader( IplImage* image );48本科生核心专业课程:数字媒体技术基础(04831800)程序示例:Create image#include cv.h#include highgui.h #include int main() IplImage *cvImg; / image used for visualisationCvS

49、ize imgSize; / size of visualisation imageint i = 0, j = 0;imgSize.width = 640; imgSize.height = 480; cvImg = cvCreateImage( imgSize, 8, 1 ); / creation of a 8 bits depth gray imagefor ( i = 0; i imgSize.width; i+ ) / image is filled with gray values corresponding for ( j = 0; j imageData + cvImg-wi

50、dthStep*j)i = ( char ) ( ( i * j ) % 256 );cvNamedWindow( Testing OpenCV., 1 ); / creation of a visualisation windowcvShowImage( Testing OpenCV., cvImg ); / image visualisationcvWaitKey( 0 ); / wait for keycvDestroyWindow( image ); / close windowcvReleaseImage( &cvImg ); / memory release return( 0 )

51、; / stopping the program本科生核心专业课程:数字媒体技术基础(04831800)程序示例:Create image50本科生核心专业课程:数字媒体技术基础(04831800)图像的使用与操作(3)o从文件读图像cvLoadImageIplImage* cvLoadImage(char* fileName, int flag=1)nOpenCV支持的图像格式:BMP、DIB、JPG、PNG、PBM、PGM、PPM、SR、RAS和TIFFo写图像到文件cvSaveImageIplImage* cvSaveImage(char* fileName, IplImage* img

52、)o图像转换cvConvertImage(IplImage* src, IplImage* dst, int flags=0); /灰度图彩色图cvCvtColor(IplImage* src, IplImage* dst, int code); /彩色图彩色图/灰度图nCode=CV_2:,=RGB,BGR,GRAY,HSV,YCrCb,XYZ,Luv,HLS 51本科生核心专业课程:数字媒体技术基础(04831800)图像装载与显示示例#include cv.h#include highgui.h#include / file example.bmp in the images direc

53、torychar name0 = images/example.bmp;/ file example.jpg in the images directorychar name1 = images/example.jpg;本科生核心专业课程:数字媒体技术基础(04831800)图像装载与显示示例int main() IplImage* img0 = NULL;IplImage* img1 = NULL;img0 = cvLoadImage( name0, -1 );img1 = cvLoadImage( name1, -1 );cvNamedWindow( image0, 1 );cvNamed

54、Window( image1, 1 );cvShowImage( image0, img0 );cvShowImage( image1, img1 );cvWaitKey(0); / wait for key to close the windowscvReleaseImage( &img0 );cvReleaseImage( &img1 );return(0);本科生核心专业课程:数字媒体技术基础(04831800)图像处理函数ocvSub( img0, img1, res, 0 ) subtract img0 from img1 and store the result in res本科生

55、核心专业课程:数字媒体技术基础(04831800)休息55本科生核心专业课程:数字媒体技术基础(04831800)第二部分o基本视频操作oOpenCV的动态结构及操作o基于OpenCV的图像/视频处理(6个示例)o基于OpenCV的研究与开发:DEMO56本科生核心专业课程:数字媒体技术基础(04831800)视频的使用和操作(1)o打开摄像头CvCapture* cvCaptureFromCAM(camera_id=0);o打开文件CvCapture* cvCaptureFromFile(videofile_path);CvCapture* cvCaptureFromAVI(inflie.a

56、vi);o捕捉某一帧 cvGrabFrame(capture) /抓住一帧,为快速遍历视频帧 IplImage* img=cvRetrieveImage(capture);/把Grab的帧取出,或 IplImage* cvQueryFrame(capture);o释放捕捉源cvReleaseCapture(&capture);57本科生核心专业课程:数字媒体技术基础(04831800)视频的使用和操作(2)o保存视频文件ntypedef struct CvVideoWriter; nCvVideoWriter* cvCreateVideoWriter( const char* filename

57、, int fourcc, double fps, CvSize frame_size, int is_color=1 );nint cvWriteFrame( CvVideoWriter* writer, const IplImage* image );nvoid cvReleaseVideoWriter( CvVideoWriter* writer );o获取/设置视频帧信息cvGetCaptureProperty(capture, property_id);cvSetCaptureProperty(capture, property_id, value);nCV_CAP_PROP_POS

58、_MSEC - video capture timestampCV_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

59、 rateCV_CAP_PROP_FOURCC - 4-character code of codec CV_CAP_PROP_FRAME_COUNT - number of frames in video file58本科生核心专业课程:数字媒体技术基础(04831800)视频操作示例(1)o功能:从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测,并输出结果。o主要思想:n获取视频( cvCaptureFromCAM 或cvCaptureFromAVI)n循环处理每帧( cvQueryFrame )1.将多通道数组分割为多个单通道数组(cvCvtPixToPlan)2.在每个通道内进

60、行Laplace变换( cvLaplace),计算图像的边缘信息3.恢复多通道图像( cvCvtPlaneToPix )并显示59本科生核心专业课程:数字媒体技术基础(04831800)Laplace变换oLaplace变换:工程数学中常用的一种积分变换。o普拉斯变换的存在性:关于一个函数f(t)的拉普拉斯变换,只有在拉普拉斯积分是收敛的情况下才存在。也就是说, f(t)必须是在对于t0的每一个有限区间内都是片断性连续的,且当t趋于无穷大的时候, f(t)是指数阶地变化。o拉普拉斯变换的重大意义在于:将一个信号从时域上,转换为复频域(s域)上来表示60本科生核心专业课程:数字媒体技术基础(04

61、831800)Laplace变换ovoid cvLaplace(const CvArr *src, CvArr * dst, int aperture_size=0)o1、用Sobel算子计算图像二阶x和y的差分nsrc:输入图像;dst:输出图像;xorder:x方向的差分阶数;yorder:y方向的差分阶数o2、按如下公式求和n对aperture_size=1则给出最快计算结果,相当于对每个图像采用如下内核做卷积61本科生核心专业课程:数字媒体技术基础(04831800)视频操作示例(1)#include cv.h#include highgui.h#include #include in

62、t main( int argc, char* argv ) IplImage* laplace = 0; IplImage* colorlaplace = 0; IplImage* planes3 = 0, 0, 0 ; / 多个图像面 CvCapture* capture = 0;If(argc=1|(argc=2& strlen(argv1) = 1&isdigit(argv10) capture = cvCaptureFromCAM(argc = 2 ? argv10 - 0 : 0 ); else if( argc = 2 ) capture = cvCaptureFromAVI(

63、argv1 ); if( !capture ) fprintf(stderr,Could not initialize capturing.n); return -1; 62本科生核心专业课程:数字媒体技术基础(04831800)视频操作示例(2) cvNamedWindow( Laplacian, 0 ); for(;) / 循环捕捉,直到用户按键跳出循环体 IplImage* frame = 0; int I; frame = cvQueryFrame( capture ); if( !frame ) break; if( !laplace ) for( i = 0; i width,fr

64、ame-height),8,1); laplace = cvCreateImage( cvSize(frame-width,frame-height), IPL_DEPTH_16S, 1 ); /存放单通道Laplace结果 colorlaplace = cvCreateImage( cvSize(frame-width,frame-height), 8, 3 ); /存放多通道Laplace结果 cvCvtPixToPlane( frame, planes0, planes1, planes2, 0 );/将多通道/数组分割为多个单通道数组 for( i = 0; i origin = fr

65、ame-origin; cvShowImage(Laplacian, colorlaplace ); if( cvWaitKey(10) = 0 ) break; cvReleaseCapture( &capture ); cvDestroyWindow(Laplacian); return 0;64本科生核心专业课程:数字媒体技术基础(04831800)OpenCV的动态结构及操作o动态结构o内存存储o序列o集合与稀疏矩阵o数据保存o配置文件本科生核心专业课程:数字媒体技术基础(04831800)动态结构:when 2d array is not enoughoThe sample task

66、: collect the locations of all non-zero pixels in the image.oWhere to store the locations? Possible solutions:nAllocate array of maximum size (sizeof(CvPoint)*width*height a huge value)nUse two-pass algorithmnUse list or similar data structuren (Any other ideas?)66/ construct sequence of non-zero pi

67、xel locationsCvSeq* get_non_zeros( const IplImage* img, CvMemStorage* storage ) CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage ); for( int i = 0; i height; i+ ) for( int j = 0; j width; j+ ) if( CV_IMAGE_ELEM(img, uchar, i, j) ) CvPoint pt=j,i; cvSeqPush( seq, &pt ); ret

68、urn seq; /CvSeq:定义非固定元素的序列本科生核心专业课程:数字媒体技术基础(04831800)内存管理oMemory storage is a linked list of memory blocks.oFunctions to remember: cvCreateMemStorage(block_size),cvReleaseMemStorage(storage); cvClearMemStorage(storage); cvMemStorageAlloc(storage,size);oAll OpenCV dynamic structures reside in memory

69、 storages.oThe model is very efficient for repetitive processing, where cvClearMemStorage is called on top level between iterations.67本科生核心专业课程:数字媒体技术基础(04831800)序列oSequence is a linked list of memory blocksoLarge sequences may be split into multiple storage blocks, while several small sequences may

70、 fit into the single storage block.oSequence is deque: adding/removing elements to/from either end is O(1) operation, inserting/removing elements from the middle is O(N).oAccessing arbitrary element is also O(1) (when storage block size sequence block)oSequences can not be released, use cvClear|Rele

71、aseMemStorage()oBasic Functions:ncvCreateSeq(flags,header_size,element_size,storage),ncvSeqPushFront(seq,element), cvSeqPopFront(seq,element),ncvClearSeq(seq), cvGetSeqElem(seq,index),ncvStartReadSeq(seq,reader), cvStartAppendToSeq(seq,writer).68本科生核心专业课程:数字媒体技术基础(04831800)集合与稀疏矩阵oSet is variant of

72、sequence with free node list and its active elements do not follow each other that is, it is convenient way to organize a heap of same-size memory blocks.oSparse matrix in OpenCV uses CvSet for storing elements.69/ Collecting the image colorsCvSparseMat* get_color_map( const IplImage* img ) int dims

73、 = 256, 256, 256 ; CvSparseMat* cmap = cvCreateSparseMat(3, dims, CV_32SC1); for( int i = 0; i height; i+ ) for ( int j = 0; j width; j+ ) uchar* ptr=&CV_IMAGE_ELEM(img,uchar,i,j*3); int idx = ptr0,ptr1,ptr2; (int*)cvPtrND(cmap,idx)0+; CvSparseMatIterator it; / print the map for(CvSparseNode *node =

74、 cvInitSparseMatIterator( mat, &iterator ); node != 0; node = cvGetNextSparseNode( &iterator ) int* idx = CV_NODE_IDX(cmap,node); int count=*(int*)CV_NODE_VAL(cmap,idx); printf( (b=%d,g=%d,r=%d): %dn, idx0, idx1, idx2, count ); return cmap; 本科生核心专业课程:数字媒体技术基础(04831800)数据存储o数据存储与装载70/ somewhere deep

75、in your code you get 5x5/ matrix that youd want to save CvMat A = cvMat( 5, 5, CV_32F, the_matrix_data ); cvSave( my_matrix.xml, &A );/ to load it then in some other program use CvMat* A1 = (CvMat*)cvLoad( my_matrix.xml ); 5 5 f 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.

76、1.本科生核心专业课程:数字媒体技术基础(04831800)配置文件71CvFileStorage* fs = cvOpenFileStorage(cfg.xml, 0, CV_STORAGE_WRITE);cvWriteInt( fs, frame_count, 10 );cvWriteStartWriteStruct( fs, frame_size, CV_NODE_SEQ);cvWriteInt( fs, 0, 320 );cvWriteint( fs, 0, 200 );cvEndWriteStruct(fs);cvWrite( fs, color_cvt_matrix, cmatri

77、x );cvReleaseFileStorage( &fs );Writing config fileCvFileStorage* fs = cvOpenFileStorage(cfg.xml, 0, CV_STORAGE_READ);int frame_count = cvReadIntByName( fs, 0, frame_count, 10 /* default value */ );CvSeq* s = cvGetFileNodeByName(fs,0,frame_size)-data.seq;int frame_width = cvReadInt( (CvFileNode*)cvG

78、etSeqElem(s,0) );int frame_height = cvReadInt( (CvFileNode*)cvGetSeqElem(s,1) );CvMat* color_cvt_matrix = (CvMat*)cvRead(fs,0,color_cvt_matrix);cvReleaseFileStorage( &fs );Reading config file10320 200 3 3 f cfg.xml本科生核心专业课程:数字媒体技术基础(04831800)基于OpenCV的图像/视频处理1.角点检测2.Canny边缘检测3.轮廓(Contour)检测4.视频人脸检测5.

79、运动对象检测6.运动对象跟踪:利用OpenCV架构大型程序o注:本讲义中部分代码来自OpenCV样例,部分代码来自OpenCV教程基础篇,部分代码从网上收集本科生核心专业课程:数字媒体技术基础(04831800)程序示例1:角点检测o什么是角点?nCorners as Interest PointsnCorner points are formed from two or more edges and edges usually define the boundary between two different objects or parts of the same objecto角点检测的

80、应用nstereo matching nimage registration (of particular importance in medical imaging) nstitching of panoramic photographs nobject detection/recognition nmotion tracking nrobot navigation 73本科生核心专业课程:数字媒体技术基础(04831800)程序示例1:角点检测o四种OpenCV角点检测方法1.cvGoodFeaturesToTrack,cvCornerMinEigenVal,CornerEigenVals

81、AndVecs:用到了图像差分的相关矩阵。2.CornerHarris:利用CornerEigenValsAndVecs得到的图像差分相关矩阵,据其特征值和向量,判断角点,Harris角点探测器R(x, y) =det(M)-k*trace2(M)3.FindCornerSubPix:子象素级角点定位,是基于对向量正交性的观测而实现的。4.cvPreCornerDetect:计算一个二阶导多项式,角点被认为是函数的局部最大值。其实就是利用了梯度的变化率在边缘走 向的投影能反映尖锐程度。实验表明这是一种比cvGoodFeaturesToTrack粗略的办法。n注意:1,2,4都是检测像素级的角点

82、。74本科生核心专业课程:数字媒体技术基础(04831800)程序示例1:角点检测(1)#include #include cv.h#include highgui.h#define max_corners 100int main( int argc, char* argv ) int cornerCount=max_corners; CvPoint2D32f cornersmax_corners; IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0; int i; CvScalar color = CV_R

83、GB(255,0,0); char* filename = argc = 2 ? argv1 : (char*) pic3.png; cvNamedWindow(image, 1 ); srcImage = cvLoadImage(filename, 1); /Load the image to be processed grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1); /copy the source image to copy image after converting the format cvCvtCol

84、or(srcImage, grayImage, CV_BGR2GRAY); /create empty images of same size as the copied images corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1); corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);75本科生核心专业课程:数字媒体技术基础(04831800)程序示例1:角点检测(2) cvGoodFeaturesToTrack (grayImage, cor

85、ners1, corners2, corners, &cornerCount, 0.05, 5, 0, 3, / block size 0, / not use harris 0.4 ); printf(num corners found: %dn, cornerCount); / draw circles at each corner location in the gray image and /print out a list the corners if(cornerCount0) for (i=0; iwidth,image-height), IPL_DEPTH_8U, 3); /

86、Create the output image / 将彩色图像转换为灰度图像 gray = cvCreateImage(cvSize(image-width,image-height), IPL_DEPTH_8U, 1); edge = cvCreateImage(cvSize(image-width,image-height), IPL_DEPTH_8U, 1); cvCvtColor(image, gray, CV_BGR2GRAY); cvNamedWindow(wndname, 1); / Create a window / create a toolbar, edge_thresh

87、corresponds to the bar value cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar); on_trackbar(0); / Show the image cvWaitKey(0); / Wait for a key stroke cvReleaseImage(&image); cvReleaseImage(&gray); cvReleaseImage(&edge); cvDestroyWindow(wndname); return 0;81本科生核心专业课程:数字媒体技术基础(04831

88、800)程序示例2:Canny边缘检测82阈值=0阈值=30本科生核心专业课程:数字媒体技术基础(04831800)程序示例3:轮廓(Contour)检测83本科生核心专业课程:数字媒体技术基础(04831800)程序示例3:轮廓(Contour)检测oint cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq* first contour, int header size=sizeof(CvContour), int mode=CV RETR LIST, int method=CV CHAIN APPROX SIMPLE, C

89、vPoint offset=cvPoint(0,0) );o宏CV_GET_SEQ可以读出轮廓中的任意点nCV_GET_SEQ_ELEM( TYPE, seq, index ) (TYPE*)cvGetSeqElem( (CvSeq*)(seq), (index) )84本科生核心专业课程:数字媒体技术基础(04831800)程序示例3:轮廓(Contour)检测(1)#include cv.h#include cxcore.h#include highgui.hint main( int argc, char* argv ) IplImage* pImg = NULL; /声明IplImag

90、e指针 IplImage* pContourImg = NULL; CvMemStorage * storage = cvCreateMemStorage(0); CvSeq * contour = 0; int mode = CV_RETR_EXTERNAL; if( argc = 3) if(strcmp(argv2, all) = 0)mode = CV_RETR_CCOMP; /内外轮廓都检测 cvNamedWindow(src, 1); /创建窗口 cvNamedWindow(contour,1); /载入图像,强制转化为Gray if( argc = 2 & (pImg = cvL

91、oadImage( argv1, 0) != 0 ) /为轮廓显示图像申请空间。3通道图像,以便用彩色显示 cvShowImage( src, pImg ); pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U, 3);85本科生核心专业课程:数字媒体技术基础(04831800)程序示例3:轮廓(Contour)检测(2) /copy source image and convert it to BGR image cvCvtColor(pImg, pContourImg, CV_GRAY2BGR); cvFindContours(

92、 pImg, storage, &contour, sizeof(CvContour), mode, CV_CHAIN_APPROX_SIMPLE); /查找contour else cvDestroyWindow( src ); /销毁窗口 cvDestroyWindow( contour ); cvReleaseMemStorage(&storage); return -1; cvDrawContours(pContourImg, contour, CV_RGB(0,0,255), CV_RGB(255, 0, 0), 2, 2, 8); /将轮廓画出 cvShowImage( conto

93、ur, pContourImg ); /显示图像 cvWaitKey(0); cvDestroyWindow(src ); cvDestroyWindow(contour); /销毁窗口 cvReleaseImage( &pImg ); cvReleaseImage( &pContourImg ); /释放图像 cvReleaseMemStorage(&storage); return 0;86本科生核心专业课程:数字媒体技术基础(04831800)DEMO87本科生核心专业课程:数字媒体技术基础(04831800)问题o输入Lena图片结果会怎么样?88本科生核心专业课程:数字媒体技术基础(

94、04831800)程序示例4:人脸检测89图像中人脸检测视频中人脸检测本科生核心专业课程:数字媒体技术基础(04831800)程序示例4:人脸检测90Haar Features+Adaboost:combines the performance of many weak classifiers to produce a powerful committee本科生核心专业课程:数字媒体技术基础(04831800)基于AdaBoost的快速人脸检测o基于分级分类器的加速策略n大量候选窗口可以利用非常少量的特征(简单快速的分类器)就可以排除是人脸的可能性!n只有极少数需要大量的特征(更复杂的更慢的分

95、类器来判别是否人脸)91本科生核心专业课程:数字媒体技术基础(04831800)程序示例4:人脸检测o数据结构nCvHaarFeature, CvHaarClassifier, CvHaarStageClassifier, CvHaarClassifierCascade定义Boosted Haar分类器级联结构Cascade: Stage 1:Classifier 11:Feature 11Classifier 12:Feature 12 Stage 2:Classifier 21:Feature 21 o数据操作nHaarDetectObjects:检测图像中的目标nLoadHaarClas

96、sifierCascasenReleaseHaarClassifierCascase 92本科生核心专业课程:数字媒体技术基础(04831800)程序示例4:人脸检测(1)#include cv.h#include highgui.hint main( int argc, char* argv ) static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; CvCapture* capture = 0; int optlen = strlen(-cascade=); if( argc != 3 |

97、 strncmp( argv1, -cascade=, optlen ) return -1; cascade = (CvHaarClassifierCascade*) cvLoad( argv1 + optlen ); capture = cvCaptureFromAVI( argv2 ); if( !cascade | !capture ) return -1; storage = cvCreateMemStorage(0); cvNamedWindow( Video, 1 );93本科生核心专业课程:数字媒体技术基础(04831800)程序示例4:人脸检测(2)for(;) IplIma

98、ge* frame = cvQueryFrame( capture ), *img; CvSeq* faces; if( !frame ) break; img = cvCloneImage(frame); img-origin = 0; if( frame-origin ) cvFlip(img,img); cvClearMemStorage( &storage ); faces = cvHaarDetectObjects( img, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(20, 20) ); for( int

99、i = 0; i total : 0); i+ ) /多个人多个人脸情况情况 CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); cvRectangle( img, cvPoint(r-x,r-y), cvPoint(r-x+r-width,r-y+r-height), CV_RGB(255,0,0), 3 ); cvShowImage( Video, img ); cvReleaseImage( &img ); if( cvWaitKey(10) = 0 ) break; cvReleaseCapture( &capture ); return 0;

100、94本科生核心专业课程:数字媒体技术基础(04831800)DEMOo功能更完善的人脸检测demonOpenCV的样例facedetect.c95本科生核心专业课程:数字媒体技术基础(04831800)DEMO中人脸检测的尺度问题96本科生核心专业课程:数字媒体技术基础(04831800)程序示例5:运动对象检测o运动:视频区别于图像的最重要特征97本科生核心专业课程:数字媒体技术基础(04831800)程序示例5:运动对象检测(1)#include #include #include #include int main( int argc, char* argv ) IplImage* pF

101、rame = NULL; /声明IplImage指针 IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; CvMat* pFrameMat = NULL; /声明矩阵指针 CvMat* pFrMat = NULL; CvMat* pBkMat = NULL; CvCapture* pCapture = NULL; int nFrmNum = 0; cvNamedWindow(video, 1); /创建窗口 cvNamedWindow(background,1); cvNamedWindow(foreground,1); cvMoveWindow

102、(video, 30, 0); /使窗口有序排列 cvMoveWindow(background, 360, 0); cvMoveWindow(foreground, 690, 0); if( argc != 2 ) fprintf(stderr, Usage: bkgrd n); return -1; 98本科生核心专业课程:数字媒体技术基础(04831800)程序示例5:运动对象检测(2)if( !(pCapture = cvCaptureFromFile(argv1) /打开视频文件 fprintf(stderr, Can not open video file %sn, argv1);

103、 return -2; while(pFrame = cvQueryFrame( pCapture ) /逐帧读取视频 nFrmNum+; if(nFrmNum = 1)/如果是第一帧,需要申请内存,并初始化 pBkImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); pFrImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); pBkMat = cvCreateMat(pFrame-height, pFram

104、e-width,CV_32FC1); pFrMat = cvCreateMat(pFrame-height, pFrame-width,CV_32FC1); pFrameMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); /转化成单通道图像再处理 cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY); cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); cvConvert(pFrImg, pFrameMat); cvConvert(pFrImg, pFrMat); cvCon

105、vert(pFrImg, pBkMat);99本科生核心专业课程:数字媒体技术基础(04831800)程序示例5:运动对象检测(3)else cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); cvConvert(pFrImg, pFrameMat); cvAbsDiff(pFrameMat, pBkMat, pFrMat); /当前帧跟背景图相减 cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);/二值化前景图 /cvErode(pFrImg, pFrImg, 0, 1); /形态学滤波,使用任意结

106、构元素腐蚀图像 /cvDilate(pFrImg, pFrImg, 0, 1); /形态学滤波,使用任意结构元素膨胀图像 cvRunningAvg(pFrameMat, pBkMat, 0.003, 0); /更新背景 cvConvert(pBkMat, pBkImg); /将背景转化为图像格式,用以显示 cvShowImage(video, pFrame); /显示图像 cvShowImage(background, pBkImg); /显示背景图像 cvShowImage(foreground, pFrImg); /显示前景图像 if( cvWaitKey(2) = 0 ) break;

107、/如果有按键事件,则跳出循环 cvDestroyWindow(video); /销毁窗口 cvDestroyWindow(background); cvDestroyWindow(foreground); cvReleaseImage(&pFrImg); /释放图像和矩阵 cvReleaseImage(&pBkImg); cvReleaseMat(&pFrameMat); cvReleaseMat(&pFrMat); cvReleaseMat(&pBkMat); return 0;100本科生核心专业课程:数字媒体技术基础(04831800)DEMOo未采用形态学滤波o采用形态学滤波后,效果会

108、怎么样?101本科生核心专业课程:数字媒体技术基础(04831800)程序示例6:运动对象跟踪o用OpenCV构造大型的视频分析与处理程序o运动物体跟踪n把运动的物体检测出来,对目标编号并获取其运动轨迹。n系统在检测和跟踪到物体后,可以对物体进行特征提取以识别运动物体的种类、大小、运动方向以及其他所必要的特征信息。102前景检测模块新团块检测模块轨迹生成模块团块跟踪模块轨迹后处理模块视频帧团块(ID:标识符,Pos:位置,Size:大小)团块位置校正跟踪模块本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:基本结构(1)o团块:CvBlob结构描述团块的位置、大小和标识符s

109、truct CvBlob float x,y; /* blob position */ float w,h; /* blob sizes */ int ID; /* blbo ID */ ;103本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:基本结构(2)o团块列表:CvBlobSeq类用来表示一系列团块,可以是运动轨迹,或当前帧中的所有团块class CvBlobSeqpublic:CvBlobSeq(int BlobSize = sizeof(CvBlob);virtual CvBlobSeq();virtual CvBlob* GetBlob(int BlobIn

110、dex);virtual void DelBlob(int BlobIndex);virtual void AddBlob(CvBlob* pB);virtual int GetBlobNum();protected:CvMemStorage* m_pMem;CvSeq* m_pSeq;char m_pElemFormat1024;104本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:基本结构(3)o团块跟踪参数:用来描述跟踪流程类CvBlobTrackerAuto的参数struct CvBlobTrackerAutoParam1int FGTrainFrames; /*

111、 number of frames */CvFGDetector*pFG; /* FGDetector module*/CvBlobDetector*pBD; /* blob detector module*/CvBlobTracker*pBT; /* blob tracking module*/CvBlobTrackGen*pBTGen; /* blob trajectory generator*/CvBlobTrackPostProc* pBTPP; /* blob trajectory postprocessing module*/int UsePPData;CvBlobTrackAna

112、lysis* pBTA; /* blob trajectory analysis module */;105本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:模块(1)o前景检测模块/* list of FG DETECTION modules */typedef struct DefModule_FGDetector CvFGDetector* (*create)(); char* nickname; char* description; DefModule_FGDetector;DefModule_FGDetector FGDetector_Modules = cvCr

113、eateFGDetector0,FG_0,Foreground Object Detection from Videos Containing Complex Background. ACM MM2003., cvCreateFGDetector0Simple,FG_0S,Simplyfied version of FG_0, cvCreateFGDetector1,FG_1,Adaptive background mixture models for real-time tracking. CVPR1999, NULL,NULL,NULL;106前景检测模块视频帧前景掩码本科生核心专业课程:

114、数字媒体技术基础(04831800)运动对象跟踪:模块(2)o团块检测模块/* list of BLOB DETECTION modules */typedef struct DefModule_BlobDetector CvBlobDetector* (*create)(); char* nickname; char* description; DefModule_BlobDetector;DefModule_BlobDetector BlobDetector_Modules = cvCreateBlobDetectorCC,BD_CC,Detect new blob by tracking

115、 CC of FG mask, cvCreateBlobDetectorSimple,BD_Simple,Detect new blob by uniform moving of connected components of FG mask, NULL,NULL,NULL;107新团块检测模块新团块(pos,size)已有团块前景掩码本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:模块(3)o团块跟踪模块/* list of BLOB TRACKING modules */typedef struct DefModule_BlobTracker CvBlobTracke

116、r* (*create)(); char* nickname; char* description; DefModule_BlobTracker;DefModule_BlobTracker BlobTracker_Modules = cvCreateBlobTrackerCCMSPF,CCMSPF,connected component tracking and MSPF resolver for collision, cvCreateBlobTrackerCC,CC,Simple connected component tracking, cvCreateBlobTrackerMS,MS,M

117、ean shift algorithm , cvCreateBlobTrackerMSFG,MSFG,Mean shift algorithm with FG mask using, cvCreateBlobTrackerMSPF,MSPF,Particle filtering based on MS weight, NULL,NULL,NULL;108团块跟踪模块团块(ID,pos,size)新团块位置前景掩码视频帧本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:模块(4)o轨迹生成模块/* list of BLOB TRAJECTORY GENERATION modu

118、les */typedef struct DefModule_BlobTrackGen CvBlobTrackGen* (*create)(); char* nickname; char* description; DefModule_BlobTrackGen;DefModule_BlobTrackGen BlobTrackGen_Modules = cvCreateModuleBlobTrackGenYML,YML,Generate track record in YML format as synthetic video data, cvCreateModuleBlobTrackGen1,

119、RawTracks,Generate raw track record (x,y,sx,sy),(). in each line, NULL,NULL,NULL;109轨迹跟踪模块轨迹列表所有团块(ID,pos,size)前景掩码视频帧本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:模块(5)o轨迹后处理模块/* list of BLOB TRAJECTORY POST PROCESSING modules */typedef struct DefModule_BlobTrackPostProc CvBlobTrackPostProc* (*create)(); char

120、* nickname; char* description; DefModule_BlobTrackPostProc;DefModule_BlobTrackPostProc BlobTrackPostProc_Modules = cvCreateModuleBlobTrackPostProcKalman,Kalman,Kalman filtering of blob position and size, NULL,None,No post processing filter,/ cvCreateModuleBlobTrackPostProcTimeAverRect,TimeAverRect,A

121、verage by time using rectangle window,/ cvCreateModuleBlobTrackPostProcTimeAverExp,TimeAverExp,Average by time using exponential window, NULL,NULL,NULL;110本科生核心专业课程:数字媒体技术基础(04831800)运动对象跟踪:模块(6)o轨迹分析模块/* list of BLOB TRAJECTORY ANALYSIS modules */CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysis

122、Detector();typedef struct DefModule_BlobTrackAnalysis DefModule_BlobTrackAnalysis;DefModule_BlobTrackAnalysis BlobTrackAnalysis_Modules = cvCreateModuleBlobTrackAnalysisHistPVS,HistPVS,Histogram of 5D feature vector analysis (x,y,vx,vy,state), NULL,None,No trajectory analiser, cvCreateModuleBlobTrac

123、kAnalysisHistP,HistP,Histogram of 2D feature vector analysis (x,y), cvCreateModuleBlobTrackAnalysisHistPV,HistPV,Histogram of 4D feature vector analysis (x,y,vx,vy), cvCreateModuleBlobTrackAnalysisHistSS,HistSS,Histogram of 4D feature vector analysis (startpos,endpos), cvCreateModuleBlobTrackAnalysi

124、sTrackDist,TrackDist,Compare tracks directly, cvCreateModuleBlobTrackAnalysisIOR,IOR,Integrator (by OR operation) of several analysers , NULL,NULL,NULL;111本科生核心专业课程:数字媒体技术基础(04831800)DEMOo程序源码参见”OpenCV样例”blobtracko可以在blobtrack基础上添加自己的算法以实现前景检测、团块检测与跟踪、轨迹生成与后处理等功能n留待课后思考112本科生核心专业课程:数字媒体技术基础(04831800)基于OpenCV的研究开发:DEMOo视频文字/人脸检测、分割与识别o视频指纹提取与比对113本科生核心专业课程:数字媒体技术基础(04831800)114视频文字/人脸检测与识别DEMOo文字和人脸是图像/视频检索中最重要的两种语义线索n文字:文字检测、分割与识别(OCR)n人脸:人脸检测、标注与识别本科生核心专业课程:数字媒体技术基础(04831800)视纹提取与应用系统2024/9/4115本科生核心专业课程:数字媒体技术基础(04831800)Thanks!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号