OpenCV概述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenCV概述

数字图像处理技术和计算机视觉技术的迅速发展及其庞大的应用市场,迫切需要像计算机图形学的OpenGL和DirectX那样的标准API。近年来,Intel推出了高性能的开源计算机视觉库OpenCV(Open Source Computer Vision Library),应用OpenCV可以大大简化图像处理与计算机视觉程序设计工作,提高软件开发效率。

OpenCV包含了几百个图像处理和计算机视觉方面的C语言函数和一些C++类,实现了许多流行的图像处理和计算机视觉算法。OpenCV的目标是形成一个易于使用的图像处理和计算机视觉软件开发包,来解决该领域的一些共性问题。

OpenCV具有跨平台、免费、速度快、易于使用的特点,提供了透明的IPP(Integrated Performance Primitives)接口,能够基于Intel处理器进行性能优化。OpenCV资源非常丰富,其源码(包括参考手册)可以从:/projects/opencvlibrary/免费下载,程序设计中遇到的问题可求助于OpenCV讨论组(/group/OpenCV/)和邮件列表。另外,从/可以获取相关的中文信息。学习OpenCV的主要方法是阅读OpenCV参考手册,查看例程,以及查看邮件列表。

现在出版的中文书:

《学习OpenCV(中文版)》

《OpenCV中文教程》

《Learning OpenCV(影印版)》

一.OpenCV类库简介

OpenCV类库主要由CxCORE、CV、CVAUX、HighGUI、ML、CVCAM等库组成,其体系结构如图1所示:

图1 OpenCV类库体系结构

1.CxCORE库是OpenCV的核心,涉及基本数据结构、矩阵操作、动态数据结构等。

2.CV库包括图像处理的常用算法(如图像滤波、图像分割、边缘检测、数学形态学

等)、结构分析(如轮廓处理、多边形逼近、Delaunay三角划分等)、模式识别、摄

像机标定、三维重建、运动分析与目标跟踪等。

3.CVAUX则是一个辅助库,包含一些试验性函数,如立体视觉匹配、隐马尔科夫场

等。

4.HighGUI库包含一些简单的用户界面函数(如创建滑动条、窗口等)、图像文件读/

写函数以及视频读/写函数。

5.ML是一个机器学习库,包含模式分类的一些C++类和函数,如贝叶斯分类器、支

持向量机、决策树、神经网络等。

6.CVCAM是有关摄像机使用的库。

二.OpenCV命名规则

OpenCV的函数和数据类型命名规则如下:

1.宏全部使用大写字符,字间用下划线分隔,如:CV_MAX_DIM,IPL_DEPTH_32F。

2.数据类型以Cv开头,如:CvSize,CvPoint3D64f等。

3.函数以cv开头,如:cvLoadImage、cvSaveImage等。

三.OpenCV的图像数据结构

利用OpenCV编写图像处理或计算机视觉程序,首先需要了解OpenCV的数据结构。OpenCV定义了图像处理中常用的数据结构,如:

1.基本数据结构:点(CvPoint)、矩形(CvRect)、标量(CvScalar)、矩阵(CvMat)、位图

(IplImage)等

2.动态数据结构:队列(CvSeq)、集合(CvSet)、图(CvGraph)、树等。

其中,IplImage是OpenCV中一种重要的数据结构,是图像读取、变换、存储的基本结构单元。它来源于Intel的IPL(Image Processing Library),但只支持其中一部分功能,其结构定义如下:

typedef struct _IplImage

{

int nSize; //IplImage结构的大小

int ID; //版本号(默认=0)

int nChannels; //通道数(支持1,2,3,4)

int depth; //像素的位深度,可支持IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F和IPL_DEPTH_64F

int dataOrder; // 0为BGR交替存储,1为按分开的通道存储。cvCreateImage只支持前者

int origin; // 0表示图像数据起点在左上角,1表示起点在左下角

int width; //图像宽度(像素数)

int height; //图像高度(像素数)

struct _IplROI *roi; //图像感兴趣区域。当该值非空时只对该区域进行处理

int imageSize; //图像数据大小(字节单位)

char *imageData; //指向排列的图像数据

int widthStep; //排列图像的行大小(字节单位),即一行占多少字节

char *imageDataOrigin; //指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的。

} IplImage;

注意:IplImage来自于Intel Image Processing Libraray(是该库本身所具有的),而OpenCV 只支持其中的一个子集,故在使用该结构时应明确其限制。

IplImage与微软的位图格式的区别:

(1)IplImage的depth是指单个通道中每个像素所用的位数;而BMP的biBitCount指的是每个像素所用的位数。

(2)通常情况下,OpenCV的图像数据实从上到下逐行存储的(即原点在左上角),而BMP 的图像数据是从下到上存储的(即原点在左下角)。当然,也有相反的情况,可分别通过origin和biHeight的取值确定图像数据的存储顺序。

相关文档
最新文档