opencv函数库常用函数

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-WindowsLinux两种平台进行开发[2]

 

 

2. OpenCV中的常用结构

 

 

OpenCV函数库的编程过程中,常常需要用到一些常用的结构,了解这些结构能够很好地利用OpenCV函数库,下面分别对CvSizeIplImage两个结构进行介绍。

 

 

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

 

 

 

 

a. 加入头文件路径

b. 加入库文件路径

1. 设置函数库路径

 

 

3.2 编程实例

 

 

在设置完编译环境后,针对OpenCV函数库的一些基本图像函数,利用下面的两个例子分别从图像的载入、显示和基本的图像处理方面介绍OpenCV的具体用法。

 

 

 

 

3.2.1.载入和显示图像

 

 

       在本例中,利用OpenCV中的命令cvLoadImagecvShowImage来载入和显示一副图像。具体程序如下:

 

 

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指针。函数支持bmpjpg 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_AUTOSIZE0两种值。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是图像保存路径和名称,imageIplImage指针变量。

 

 

5.     图像销毁函数

 

 

函数cvReleaseImage销毁已定义的IplImage指针变量,释放占用内存空间。其函数原型如下:

 

 

void cvReleaseImage( IplImage** image );

 

 

其中,image为已定义的IplImage指针。

 

 

程序运行后显示的图像窗口如图2所示,

 

 

2. 图像显示窗口

 

 

3.2.2. 基本图像处理

 

 

在本小节中,主要运用OpenCV中的函数去实现图像处理过程中的一些基本算法,包括彩色转换为灰度、形态学操作、阈值二值化和边缘提取等。下面利用边缘提取实例来具体介绍图像的处理过程。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值