学习材料OpenCV.ppt
《学习材料OpenCV.ppt》由会员分享,可在线阅读,更多相关《学习材料OpenCV.ppt(116页珍藏版)》请在三一办公上搜索。
1、OpenCV自学材料,田永鸿北京大学数字媒体研究所,第一部分,OpenCV概述基础结构与操作基本OpenCV程序与示例注:本讲义中部分代码来自OpenCV样例,部分代码来自OpenCV教程基础篇,部分代码则从网上收集。,2,OpenCV概述,OpenCV是Intel开源计算机视觉库。它由一系列 C 函数和少量 C+类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 的特点拥有包括 300 多个C函数的跨平台的中、高层 API跨平台:Windows,Linux免费(FREE):无论对非商业应用和商业应用 速度快使用方便,3,4,OpenCV structure,CXCOREbas
2、ic structures and algoritms,XML support,drawing functions,CVImage processingand vision,HighGUIGUI,Image and Video I/O,MLMachine Learning algorithms,CVCamvideo stream processing,The Functionality in Pictures,OpenCV的下载与安装,1、下载地址 2、VC6.0下的安装与配置参见 3、.NET 2003下的安装与配置参见,6,Configuring MSVS.net 2k3,Create a
3、 Win32 Console Project,Make it an Empty Project by selecting the box under Application Settings,Configuring MSVS.net 2k3,Select C+file and give it a name,Creating a file makes it possible to set Additional Include Directives in the C/C+pane under the project properties.,Configuring MSVS.net 2k3,In o
4、rder to build projects using OpenCV the required libraries and directives must be included in the projects properties,Configuring MSVS.net 2k3,Select the Additional Include Directives,Configuring MSVS.net 2k3,Select the Additional Dependencies,Testing MSVS.net 2k3,Now that the environment is configu
5、red 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 with 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
6、 place the text CvPoint pt=cvPoint(height/4,width/2);/Create an 8 bit,3 plane image IplImage*hw=cvCreateImage(cvSize(height,width),8,3);/initialize the font CvFont font;cvInitFont(,Testing MSVS.net 2k3,Output of Program,OpenCV 编码样式指南,1、文件命名:有cv和cvaux库文件的命名必须服从于以下规则:所有的CV库文件名前缀为cv 混合的C/C+接口头文件扩展名为.h
7、纯C+接口头文件扩展名为.hpp 实现文件扩展名为.cpp 为了与POSIX兼容,文件名都以小写字符组成,14,OpenCV 编码样式指南,2、文件结构每个文件以BSD兼容的许可声明(模板在Contributors_BSD_Licsense.htm文件中可以找到)开头;一行最多90个字符,不包括行结束符 不使用制表符 缩进为4个空格符,所以制表符应该用1-4个空格替换(依据开始列确定)头文件必须使用保护宏,防止文件被重复包含。混合C/C+接口头文件用extern C 包含C语言定义。为了使预编译头机制在Visual C+中工作正常,源文件必须在其它头文件前包含precomp.h头文件。,15,
8、OpenCV 编码样式指南,3、命名约定OpenCV中使用大小写混合样式来标识外部函数、数据类型和类方法。宏全部使用大写字符,词间用下划线分隔。所有的外部或内部名称,若在多个文件中可见,则必须含有前缀:外部函数使用前缀cv 内部函数使用前缀Icv 数据结构(C结构体、枚举、联合体、类)使用前缀Cv 外部或某些内部宏使用前缀CV_ 内部宏使用前缀ICV_,16,OpenCV 编码样式指南,4、函数接口设计:为了保持库的一致性,以如下方式设计接口非常重要。函数接口元素包括:功能 名称 返回值 参数类型 参数顺序 参数默认值 函数功能必须定义良好并保持精简。函数应该容易镶入到使用其它OpenCV函数
9、的不同处理过程。函数名称应该简单并能体现函数的功能。大多数函数名形式:cv,17,18,A Simple OpenCV Program,1.#include 2.#include 3.#include 4.int main(int argc,char*argv)5.CvPoint center;6.double scale=-3;7.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;iheigh
10、t;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)*scale);15.uchar*ptr=,基本数据结构,点:CvPoint、CvPoint2D32f、CvPoint3D32f 矩形框大小:CvSize、CvSize2D32f 矩形框:CvRect 可以存放1-4个数值的数组:CvScalar 定义迭代算法的终止规则:CvTermCriteria
11、矩阵:CvMat、CvMatND、CvSparseMat IPL图像头部:IplImage 定义不确定的数组:CvArr(仅作函数参数),19,点数据结构,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)CvPoint2D
12、32f:二维坐标下的点,类型为浮点CvPoint3D32f:三维坐标下的点,类型为浮点,20,矩形框大小数据结构,CvSize 矩形框大小,以像素为精度 typedef struct CvSizeint width;/*矩形宽*/int height;/*矩形高*/CvSize;/*构造函数*/inline CvSize cvSize(int width,int height);CvSize2D32f,21,矩形框数据结构,CvRect 矩形框的偏移和大小 typedef struct CvRectint x;/*方形的最左角的x-坐标*/int y;/*方形的最上或者最下角的y-坐标*/in
13、t width;/*宽*/int height;/*高*/CvRect;/*构造函数*/inline CvRect cvRect(int x,int y,int width,int height);,22,矩阵数据结构,CvMat 二维矩阵 typedef struct CvMat int type;/*CvMat 标识,元素类型和标记*/int step;/*以字节为单位的行数据长度*/int rows;/*行数*/int cols;/*列数*/int*refcount;/*数据引用计数*/unionuchar*ptr;short*s;int*i;float*fl;double*db;dat
14、a;/*data 指针*/,23,矩阵数据结构,CvMatND:多维、多通道密集数组 CvSparseMat:多维、多通道稀疏数组CvArr:不确定数组,24,图像头数据,IplImage:IPL 图像头,25,图像头数据,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,I
15、PL_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-交叉存取颜色通道,1-分开的颜色通道.cvCreateImage只能创建交叉存取图像*/int origin;/*0-顶左结构,1-底左结构(BMP风格)*/int align;/*图像行排列(4 or 8).OpenCV 用widthStep 代替*/,26,int width;/*图
16、像宽像素数*/int height;/*图像高像素数*/struct _IplROI*roi;/*图像感兴趣区域.当该值非空只对该区域进行处理*/struct _IplImage*maskROI;/*在 OpenCV中必须置NULL*/void*imageId;/*同上*/struct _IplTileInfo*tileInfo;/*同上*/int imageSize;/*图像数据大小,单位字节*/char*imageData;/*指向排列的图像数据*/int widthStep;/*排列的图像行大小,以字节为单位*/int BorderMode4;int BorderConst4;/*边际结
17、束模式,被忽略*/char*imageDataOrigin;/*指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的*/IplImage;,27,图像头数据,IplImage结构来自于 Intel Image Processing Library。OpenCV 只支持其中的一个子集:alphaChannel 在OpenCV中被忽略。colorModel 和channelSeq 被OpenCV忽略。dataOrder 必须是IPL_DATA_ORDER_PIXEL(颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。align 是被OpenC
18、V忽略的,而用 widthStep 去访问后继的图像行。不支持maskROI。处理MASK的函数把他当作一个分离的参数。MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。tileInfo 不支持。BorderMode和BorderConst是不支持的。OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或 ROI的尺寸必须精确匹配。,28,基本OpenCV操作,矩阵的使用与操作GUI命令图像的使用与操作视频的使用与操作,矩阵的使用与操作(1),创建矩阵 CreateMatCvMat*cvCreateMat(int rows,int cols,int type
19、);rows 矩阵行数。cols 矩阵列数。type 矩阵元素类型。通常以 CV_(S|U|F)C型式描述,例如:CV_8UC1 意思是一个8-bit 无符号单通道矩阵,CV_32SC2 意思是一个32-bit 有符号二个通道的矩阵。函数 cvCreateMat 为新的矩阵分配头和下面的数据,并且返回一个指向新创建的矩阵的指针。矩阵按行存贮。所有的行以4个字节对齐。删除矩阵 ReleaseMat void cvReleaseMat(CvMat*mat);例如:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvReleaseMat(,30,矩阵的使用与操作(2),复制矩阵C
20、loneMatCvMat*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,11,12;CvMat Ma=cvMat(3,4,CV_64FC1,a);方法2:用cvCreateMatHeader初始化 CvMat Ma;cvInitMatHeader(,31,矩阵的使用与操作(3),访问矩阵元素(1)直接访问cvmSet(M,i,j,2,0);/Set M(i,j
21、)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=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;,32,矩阵的使用与操作(4),矩阵间的操作
22、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)-MbCvScalar t=cvTrace(Ma);/trace(Ma)-t.val0double d=cvDet(Ma);/de
23、t(Ma)-dcvInvert(Ma,Mb);/inv(Ma)-Mb,33,矩阵的使用与操作(5),向量乘法假设Va,Vb,Vc均为n元素向量double res=cvDotProduct(/A=UDVT标志使U和V以转置方式返回非齐次线性系统的求解假设A为n*n方阵,x,b均为n元素向量cvSolve(&A,&b,&x),34,矩阵的使用与操作:示例(1),#include cv.h#include highgui.h#include void PrintMat(CvMat*A);/显示矩阵void Test_Multiply();/测试矩阵乘法void Test_DCT();/计算DCT变
24、换int main()Test_Multiply();Test_DCT();return 0;,35,矩阵的使用与操作:示例(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);break;case CV_8U:case CV_16U:for(j=0;jcols;j+)printf(%6d,(int)cvG
25、etReal2D(A,i,j);break;default:break;printf(n);,36,矩阵的使用与操作:示例(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,11,4,8,12;double c9;CvMat Ma,Mb,Mc;printf(n=Test multiply=);cvInitMatHeader(,37,矩阵的使用与操作:示例(4),void Test_DCT()/test 1-d and 2-d dct
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 材料 OpenCV
链接地址:https://www.31ppt.com/p-5256877.html