OpenCV概述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenCV概述
1999年英特尔公司在俄罗斯设立了软件开发中心“Software Development Center”,随后即启动了被称为“CVL”的研究项目。
最初“CVL”项目的研究方向包括人机界面(HCI)和实时计算机视觉等。
第二年,即2000年,该中心发布了开源计算机视觉类库OpenCV的第一个测试版,2006年底OpenCV的首个正式版1.0正式发布。
OpenCV(Open Source Computer Vision Library)是一套基于C/C++语言开发的图像处理和计算机视觉函数库,它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV拥有包括三百多个C函数在内的跨平台的中、高层API,并且不依赖与其他外部库。
此外OpenCV与Intel 公司所开发的另一图像处理库IPL(Image Processing Library)兼容,IPL用于实现对数字图像的一些低级处理,而OpenCV则可在其基础上对图像进行高级处理。
在性能表现上,OpenCV体现出了更大的优越性。
其中大部分函数在设计及汇编时被Intel公司针对其所生产的处理器进行了优化,OpenCV也为Integrated Performance Primitives(IPP)提供了透明的接口。
即OpenCV可以在运行时自动加载为特定处理器优化的IPP库,以最大程度地发挥处理器的性能。
总地来说,作为一个基本的计算机视觉、图像处理和模式识别的开源项目,OpenCV可以直接应用于很多领域,是作为第二次开发的理想工具。
OpenCV的特点
作为一个开源项目,OpenCV提供了大量数字图像处理和计算机视觉等方面的算法及其源代码。
这不仅为实际开发提供了便利,同时也使其本身成为研究和学习该方面理论知识的丰富资源——这也是OpenCV的生命力所在。
OpenCV除了有Intel公司提供的许多支持以外,还有许多专业人士及业余爱好者为其提供强有力的维护和更新,许多世界领先的学术成果能够很好地在其上得以展现,使得研究人员可以方便地接收到这些先进的理论和科研成果。
OpenCV的结构
OpenCV的体系结构
OpenCV的体系结构在设计上简单明了,它与对图像实现一些较低级处理的IPL 完全兼容,并为IPP提供了透明的接口。
它的主体部分是一系列的C函数和C++类,这些函数和类可以通过转换器向下转换为一些低级的C函数。
此外,OpenCV 还提供了DShow filters、演示程序和脚本环境等部分用以支持和丰富实际开发的应用。
OpenCV的函数结构
OpenCV中的C函数的C++类主要分为5个模块。
1.CV
Cv中包含了主要的OpenCV函数。
这些函数完成了包括图像处理,结构分析,运动分析和模式识别在内的诸多功能。
下面列举了其中十分常用的函数。
1)Resize
●函数描述:void cvResize(const CvArr* src,CvArr* dst, int
interpolation=CV_INTER_LINEAR0;
●作用:图像大小变换
●说明:src输入图像,dst为输出图像,interpolation表示所采用
的插值方法,包括最近邻插值,双线性插值和立方插值等。
2)Erode
●函数描述:void cvErode (const CvArr* src, CvArr* dst,
IplConvKernel* element=NULL, int iterations=1);
●作用:使用任意结构元素腐蚀图像。
●说明:src输入图像,dst为输出图像,element表示用于腐蚀的结
构元素,iterations表示腐蚀的次数。
3)Dilate
●函数描述:void cvDilate (const CvArr* src, CvArr* dst,
IplConvKernel* element=NULL, int iterations=1);
●作用:使用任意结构元素膨胀图像。
●说明:src输入图像,dst为输出图像,element表示用于膨胀的结
构元素,iterations表示膨胀的次数。
4)Smooth
●函数描述:void cvSmooth (const CvArr* src, CvArr* dst, int
smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double
param3=0, double param4=0);
●作用:平滑图像。
●说明:src输入图像,dst为输出图像,smoothtype表示采用的平滑
方法,包括简单平滑,高斯平滑和中值滤波等。
5)FloodFill
●函数描述:void cvFloodFill (CvArr* image, CvPoint seed_point,
CvScalar new_val, Cvscalar lo_diff=cvScalarAll(0), CvScalar
uo_diff=cvScalarAll(0), CvConnectedComp* comp=NULL, int
flags=4, CvArr* mask=NULL);
●作用:用指定颜色填充一个连接域。
6)HoughLines
●函数描述:CvSeq* cvHoughLines2 (CvArr* image, void*
line_storage, int method, double rho, double theta, int
threshold, double param1=0, double param2=0);
●作用:利用Hough变换在二值图像中找到直线。
2.Cvaux
Cvaux中包含了辅助的(实验性的)OpenCV函数。
3.Cvxcore
Cvxcore提供数据结构与线性代数支持。
4.HighGUI
HighGUI图像界面函数,包括以多种格式(Bmp、Jpeg、TIFF、PxM等)读/写图像或视频,创建窗体并在其中显示图像,以及提供简单的交互设备(例如响应键盘和鼠标的事件处理等)。
5.CvCam
CvCam视频获取函数库,它为在Linux和Win32环境下的视频获取和回放提供单一的接口,提供为后续加工处理而回收来自照相机或AVI文件的帧的功能,以及来自两部USB摄影机或立体摄影机的流畅的立体声系统。
OpenCV的功能结构
基于以上所述的函数库,OpenCV主要可以实现以下七大类功能。
●图像或视频的输入输出(包括文件与摄像头的输入、图像和视频文件输出)。
●提供基本结构与运算功能。
OpenCV所提供的基本的动态数据结构包括所有的
矢量数据存储结构(列表、队列、集合、树、图等)。
而基本运算操作包括多维阵列运算及线性代数的算法程序(如矩阵积、解方程、特征值及奇异值等),这里所说的多维阵列包括图像数据、矩阵和直方图,其中对于图像数据的操作主要包括分配、释放、复制、设置和转换。
●数字图像分析和处理,包括金字塔算法、形态处理、滤波、边缘检测、采样
与差值、色彩转换等。
●运动分析和目标跟踪。
●目标识别。
●结构分析,包括连接部件、轮廓处理、距离变换、模板匹配、Hough变换、
多边形逼近、拟合等。
●3D重构。
OpenCV的功能远不止这些,很难有统一的划分标准将其尽述,而OpenCV的强大功能却是显而易见的,它的强大的功能体系为更高效地开发项目提供了有力支持。
OpenCV的数据结构
OpenCV主要提供了4类数据类型,即多维阵列、动态数据结构(CvSeq、CvSet、CvGraph)、空间力矩(Cvmoments)和辅助数据类型。
多维阵列数据类型又包括图像(IplImage)、矩阵(CvMat)和直方图(CvHistogram)3种。
辅助数据类型用于表示二维点坐标的CvPoint、图像宽和高的CvSize、叠代过程结束条件的CvTermCriteria及图像转换内核的IplConvKernel等。
OpenCV使用“IplImage”结构体来创建和处理图像。
IplImage是IPL中唯一的一种图像格式,同时也是OpenCV和IPL共有的一种数据结构。
它包含了图像的所有信息及指向图像的数据指针。
此种格式较通常使用的DIB格式可以表示更多的图像性质,而且可以很方便地存取图像中的像素值。
IplImage的具体定义:
Typedef struct_IplImage
{
Int nSize; /* IplImage大小*/
Int ID; /*版本(=0)*/
Int nChannels; /*大多数OpenCV函数支持1、2、3或4个通道*/ Int alphaChannel;
Int depth; /*像素的位深度:
IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F和
IPL_DEPTH_64F 可支持*/
Char colorModel[4];
Char channelSeq[4];
Int dataOrder; /* 0 -交叉存取颜色通道,1 -分开的颜色通道。
cvCreateImage只能创建交叉存取图像*/ Int origin; /* 0 -顶-左结构,
1 -底-左结构(Windows bitmaps风格)*/
Int align;
Int width; /*图像宽像素数*/
Int height; /*图像高像素数*/
Struct _IplROI *roi; /*图像感兴趣区域,当该值非空只对该区域进行
处理*/
Struct _IplImage *maskROI; /* 在OpenCV中必须置NULL */
Void *imageId; /* 在OpenCV中必须置NULL */
Struct _IplTileInfo *tileInfo; /* 在OpenCV中必须置NULL */ Int imageSize; /*图像数据大小(在交叉存取格式下
imageSize=image->height*image->widthStep),单位字节*/ Char *imageData; /*指向排列的图像数据*/
Int widthStep; /*排列的图像行大小,以字节为单位*/
Int BorderMode[4];
Int BorderConst[4];
Char *imageDataOrigin; /*指针指向一个不同的图像数据结构
(不是必须排列的),是为了纠正图像内存分配准备的*/ }IplImage;
CvSeq结构是OpenCV中所有动态数据结构的基础。
CvSeq的具体定义:
Typedef struct CvSeq
{
CV_SEQUENCE_FIEIDS();
}CvSeq;
CV_SEQUENCE_FIEIDS()是一个宏定义。
可以定义一个新的结构并把自定义的域放在所有CvSeq域的后面,以此来扩展CvSeq,这提供了很大的方便。
CvPoint结构表示二维坐标系下的点,类型为整形。
CvPoint的具体定义:
Typedef struct CvPoint
{
Int x; /* x坐标,通常以0为基点 */
Int y; /* y坐标,通常以0为基点 */
}CvPoint;
// CvSize结构表示矩形框大小,以像素为精度
Typedef struct CvSize
{
Int width; /* 矩形宽 */
Int height; /* 矩形高 */
}CvSize;
OpenCV进行人脸检测
人脸检测是目前非常前沿的技术,Adaboost算法实现起来也比较复杂,但应用OpenCV提供的函数和分类器进行人脸检测将十分容易。
在OpenCV中提供的用于加载分类器的函数是cvLoadHaarClassifierCascade,该函数从文件中装载训练好的利用Haar-like 特征的级联分类器或者从OpenCV中嵌入的分类器数据库中导入,其函数原型如下:
CvHaarClassifierCascade* cvLoadHaarClassifierCascade(const char* directory, CvSize orig_window_size);
其中directory是训练好的级联分类器的路径,orig_window_size代表级联分类器训练中采用的检测目标的尺寸。
因为这个信息没有在级联分类器中存储,所以要单独指出。
OpenCV中还提供了存储在XML文件中的目标检测分类,在使用时可以直接导入,其中用于人脸检测的分类器如下:
●Haarcascade_frontalface_alt2.xml
●Haarcascade_frontalface_alt.xml
●Haarcascade_frontalface_alt_tree.xml
●Haarcascade_frontalface_default.xml
●Haarcascade_profileface.xml
OpenCV提供的用于检测图像中目标的函数是cvHaarDetectObjcets,该函数使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域,并且将这些区域作为一序列的矩形框返回,其函数原型为:
●CvSeq* cvHaarDetectObjects(const CvArr* image,
CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor=1.1, int min_neighbors=3, int flags=0, CvSize min_size=cvSize(0,0));
函数以不同比例大小的扫描窗口对图像进行几次搜索,每次都要对图像中的这些重叠区域利用cvRunHaarClassifierCascade进行检测。
有时候也会利用某些继承技术以减少分析的候选区域。
函数在处理和收集到候选的方框之后,接着对这些区域进行组合并且返回一系列足够大的组合中的平均矩形。
通过调节程序中的参数可以实现对目标进行更精确,但也是耗时较长的进一步检测。
函数中的参数说明:
●参数image表示被检测的图像,cascade是所选用的分类器。
●参数storage用来存储检测到的一序列候选目标矩形框的内存区域。
●参数scale_factor是在前后两次相继的扫描中,搜索窗口的比例系数。
例如当scale_factor=1.1是表示将搜索窗口依次扩大10%。
●参数min_neighbors构成检测目标的相邻矩形的最小个数。
如果组成检
测目标的小矩形的个数和小于min_neighbors-1则这些矩形就会被排
除。
如果min_neighbors=0,那么函数不做任何操作就返回所有的被检
候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
●参数flags表示操作方式。
该参数的默认值为0,此时表示采用的操作
方式是CV_HAAR_DO_CANNY_PRUNING,这也是当前唯一可以定义的操作方
式。
一旦该方式被设定,那么该函数将利用Canny边缘检测器来排除一
些边缘很少或者很多的图像区域,因为这样的区域通常不会包含被检目
标。
●参数min_size是检测窗口的最小尺寸。
在默认的情况下它被设为分类器
训练时采用的样本尺寸,例如人脸检测中默认大小是20×20.
分类器在使用后需要被显示释放,所使用的函数是cvReleaseHaar-ClassifierCascade,其函数原型如下:
●void cvReleaseHaarClassifierCascade(CvHaarClassifierCascade**
cascade);
其中参数cascade双指针类型指针指向要释放的分类器。