OpenCV函数库 | ||||
1.引言
OpenCV(Intel® Open Source Computer Vision Library) 是Intel 公司面向应用程序开发者开发的计算机视觉库,其中包含大量的函数用来处理计算机视觉领域中常见的问题,例如运动分析和跟踪、人脸识别、3D 重建和目标识别等[1]。目前该函数库的最新版本是OpenCV 4.0,可以通过访问http://www.sourceforge.net/projects/opencvlibrary 免费获得OpenCV 库以及相关的资料。另外,还可以通过访问http://www.yahoogroups.com/group/OpenCV,对于OpenCV使用中的一些问题与经验进行讨论。
相对于其它图像函数库,OpenCV是一种源码开放式的函数库,开发者可以自由地调用函数库中的相关处理函数。OpenCV中包含300多个处理函数[1],具备强大的图像和矩阵运算能力,可以大大减少开发者的编程工作量,有效提高开发效率和程序运行的可靠性。另外,由于OpenCV具有很好的移植性,开发者可以根据需要在MS-Windows和Linux两种平台进行开发[2]。
2. OpenCV中的常用结构
在OpenCV函数库的编程过程中,常常需要用到一些常用的结构,了解这些结构能够很好地利用OpenCV函数库,下面分别对CvSize和IplImage两个结构进行介绍。
2.1 CvSize结构
CvSize结构表示矩形尺寸的结构,结构体中分别定义了矩形的宽度和高度,具体定义如下:
typedef struct CvSize
{
int width; /* 矩形宽度,单位为象素 */
int height; /* 矩形高度,单位为象素 */
} CvSize;
与CvSize结构相关的是其构造函数:
inline CvSize cvSize( int width, int height );
在定义CvSize结构变量时,可以按照如下方式定义:
CvSize size=cvSize(400,300); /* 定义宽为400象素,高为300象素的矩形 */
Cvsize结构用来设置矩形区域大小,在一些复杂高级的结构体常常能够看到它,如下面将要介绍的IplImage结构。
2.2 IplImage结构
由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下:
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 和IPL_DEPTH_64F */
char colorModel[4]; /* 被OpenCV忽略 */
char channelSeq[4]; /* 同上 */
int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
只有cvCreateImage可以创建交叉存取图像 */
int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */
int align; /* 图像行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 */
int width; /* 图像宽像素数 */
int height; /* 图像高像素数*/
struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时,
只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */
void *imageId; /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/
char *imageData; /* 指向排列的图像数据 */
int widthStep; /* 排列的图像行大小,以字节为单位 */
int BorderMode[4]; /* 边际结束模式, 在 OpenCV 被忽略*/
int BorderConst[4]; /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
} IplImage;
IplImage结构体是整个OpenCV函数库的基础,在定义该结构变量时需要用到函数cvCreatImage,变量定义方法如下:
IplImage* src="/cvCreateImage"(cvSize(400,300), IPL_DEPTH_8U,3);
上句定义了一个IplImage指针变量src,图像的大小是400×300,图像颜色深度8位,3通道图像。
3.VC++环境下OpenCV的编程方法
OpenCV主要由大量C函数和少数的C++函数类构成的,在Visual C++中调用OpenCV相当方便,不过,在开始编译程序前需要设置好编译环境。在本节中,首先介绍VC++环境的设置,然后通过两个例子来说明如何在程序中调用OpenCV。
3.1 VC++的环境设置
由于OpenCV是一个图像库,因此在VC++中编程之前需要预先设置编程环境,即将OpenCV需要的一些函数头文件和库文件加入到当前编译的工程中,使得程序在编译时能够正确地找到所需文件。下面针对头文件和库文件的环境分别进行设置。
3.1.1 设置头文件环境 选择Tools菜单下的Opinions项,点击Directories标签,在Show directories for下拉列表框中选择Include files项,在Directories 中加入OpenCV以下两个路径:
〈OpenCV安装目录〉/cv/include
〈OpenCV安装目录〉/otherlibs/highgui
3.1.2 设置库文件环境
选择Tools菜单下的Opinions项,点击Directories标签,在Show directories for下拉列表框中选择Library files项,在Directories 中加入OpenCV以下两个路径:
〈OpenCV安装目录〉/lib
图1. 设置函数库路径
3.2 编程实例
在设置完编译环境后,针对OpenCV函数库的一些基本图像函数,利用下面的两个例子分别从图像的载入、显示和基本的图像处理方面介绍OpenCV的具体用法。
3.2.1.载入和显示图像
在本例中,利用OpenCV中的命令cvLoadImage和cvShowImage来载入和显示一副图像。具体程序如下:
例1.图像载入和显示
#i nclude "stdafx.h"
#i nclude "cv.h" /*OpenCV的基本函数头文件/
#i nclude "highgui.h" /* OpenCV的图像显示函数头文件*/
void main()
{
IplImage* src="/cvLoadImage"("lena.jpg",-1); /* 定义IplImage指针变量src,并且将src指向当前目录下的图像lena.jpg */
cvNamedWindow("src",CV_WINDOW_AUTOSIZE); /* 定义一个窗口名为src的显示窗口 */
cvShowImage("src",src); /* 在src窗口中,显示src指针所指的图像*/
cvSaveImage(“d:/lena.jpg”,src); /* 保存图像*/
cvReleasImage(&src); /* 释放IplImage指针src*/
}
在例1中,所用到的五个函数都是比较常用的,下面一一进行介绍。
1. 图像载入函数
函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。函数支持bmp、jpg、 png、 tiff等格式的图像。其函数原型如下:
IplImage* cvLoadImage( const char* filename, int iscolor);
其中,filename 是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。
2. 窗口定义函数
函数cvNamedWindow定义一个窗口,用于显示图像。其函数原型如下:
int cvNamedWindow( const char* name, unsigned long flags );
其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。
3. 图像显示函数
函数cvShowImage是在指定的窗口中显示图像,其函数原型如下:
void cvShowImage( const char* name, const CvArr* image );
其中,name是窗口名称,image是图像类型指针,一般是IplImage指针。
4. 图像保存函数
函数cvSaveImage以指定的文件名保存IplImage类型的指针变量,其函数原型如下:
int cvSaveImage( const char* filename, const CvArr* image );
其中,filename是图像保存路径和名称,image是IplImage指针变量。
5. 图像销毁函数
函数cvReleaseImage销毁已定义的IplImage指针变量,释放占用内存空间。其函数原型如下:
void cvReleaseImage( IplImage** image );
其中,image为已定义的IplImage指针。
程序运行后显示的图像窗口如图2所示,
图2. 图像显示窗口
3.2.2. 基本图像处理
在本小节中,主要运用OpenCV中的函数去实现图像处理过程中的一些基本算法,包括彩色转换为灰度、形态学操作、阈值二值化和边缘提取等。下面利用边缘提取实例来具体介绍图像的处理过程。
|