OpenCV使用说明.docx

上传人:b****6 文档编号:5949442 上传时间:2023-01-02 格式:DOCX 页数:31 大小:143.68KB
下载 相关 举报
OpenCV使用说明.docx_第1页
第1页 / 共31页
OpenCV使用说明.docx_第2页
第2页 / 共31页
OpenCV使用说明.docx_第3页
第3页 / 共31页
OpenCV使用说明.docx_第4页
第4页 / 共31页
OpenCV使用说明.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

OpenCV使用说明.docx

《OpenCV使用说明.docx》由会员分享,可在线阅读,更多相关《OpenCV使用说明.docx(31页珍藏版)》请在冰豆网上搜索。

OpenCV使用说明.docx

OpenCV使用说明

 

1引言

OpenCV(Intel®OpenSourceComputerVisionLibrary)是Intel公司面向应用程序开发者开发的计算机视觉库,其中包含大量的函数用来处理计算机视觉领域中常见的问题,例如运动分析和跟踪、人脸识别、3D重建和目标识别等。

目前该函数库的最新版本是OpenCV4.0,可以通过访问免费获得OpenCV库以及相关的资料。

另外,还可以通过访问

相对于其它图像函数库,OpenCV是一种源码开放式的函数库,开发者可以自由地调用函数库中的相关处理函数。

OpenCV中包含500多个处理函数,具备强大的图像和矩阵运算能力,可以大大减少开发者的编程工作量,有效提高开发效率和程序运行的可靠性。

另外,由于OpenCV具有很好的移植性,开发者可以根据需要在MS-Windows和Linux两种平台进行开发,速度快,使用方便。

2OpenCV的结构

目前OpenCV包含如下几个部分:

Cxcore:

一些基本函数(各种数据类型的基本运算等)

Cv:

图像处理和计算机视觉功能(图像处理,结构分析,运动分析,物体跟踪,模式识别,摄像定标)

Highgui:

用户交互部分(GUI,图像视频I/O,系统调用函数)

Cvaux:

一些实验性的函数(ViewMorphing,三维跟踪,PCA,HMM)

另外还有cvcam,不过linux版本中已经抛弃。

Windows版本中将DirectX支持加入highgui后,cvcam将被彻底去掉。

功能介绍:

1)图像增强

直方图均衡化cvEqualizeHist;

2)图像变换

傅立叶变换:

cvDFT

离散余弦变换:

cvDCT

霍特林变换(PCA):

cvCalPCA,cvProjectPCA,cvBackProjectPCA

3)其它功能

数学计算:

矩阵的加减乘除,转置,逆,伪逆,逻辑运算,统计,SVD分解

图像处理:

梯度,插值,几何变换,形态学操作,滤波,色彩空间变换,矩,

直方图,特征匹配

结构分析:

轮廓处理,几何形状计算,平面划分

运动分析:

对象跟踪,对象检测,相机定标,三维重建,分类器设计

3VC6下的安装与配置

3.1安装OpenCV(略)

3.2配置Windows环境变量

检查C:

\ProgramFiles\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。

加入后需要注销当前Windows用户(或重启)后重新登陆才生效。

(可以在任务管理器里重启explorer.exe)

4VC++的环境设置

OpenCV主要由大量C函数和少数的C++函数类构成的,在VisualC++中调用OpenCV相当方便,不过,在开始编译程序前需要设置好编译环境。

因此,首先介绍VC++环境的设置。

由于OpenCV是一个图像库,因此在VC++中编程之前需要预先设置编程环境,即将OpenCV需要的一些函数头文件和库文件加入到当前编译的工程中,使得程序在编译时能够正确地找到所需文件。

菜单Tools->Options->Directories:

先设置lib路径,选择Libraryfiles,在下方填入路径:

C:

\ProgramFiles\OpenCV\lib

然后选择includefiles,在下方填入路径:

C:

\ProgramFiles\OpenCV\cxcore\include

C:

\ProgramFiles\OpenCV\cv\include

C:

\ProgramFiles\OpenCV\cvaux\include

C:

\ProgramFiles\OpenCV\ml\include

C:

\ProgramFiles\OpenCV\otherlibs\highgui

C:

\ProgramFiles\OpenCV\otherlibs\cvcam\include

然后选择sourcefiles,在下方填入路径:

C:

\ProgramFiles\OpenCV\cv\src

C:

\ProgramFiles\OpenCV\cxcore\src

C:

\ProgramFiles\OpenCV\cvaux\src

C:

\ProgramFiles\OpenCV\otherlibs\highgui

C:

\ProgramFiles\OpenCV\otherlibs\cvcam\src\windows

最后点击“ok”,完成设置。

5如何创建一个项目来开始OpenCV编程

为了创建基于OpenCV的项目,按如下步骤进行:

(一)创建新的应用程序:

1)选择菜单"File"->"New..."->"Projects"标签。

选择"Win32consoleapplication"

2)键入项目名称,并且选择保存位置。

3)可以为项目创建一个单独的workspace("Createnewworkspace"),也可以将新的项目加入到当前的workspace中("Addtocurrentworkspace")。

4)单击"next"按钮。

5)选择"Anemptyproject",点击"Finish","OK"。

经过以上步骤,DeveloperStudio会创建一个项目目录(缺省情况下,目录名就是项目名),.dsp文件以及.dsw,.ncb等,如果你创建自己的workspace。

(二)添加文件到project中:

1)选择菜单"File"->"New..."->"Files"。

2)选择"C++SourceFile",键入文件名,点击"OK"。

3)增加OpenCV相关的头文件目录:

#include"cv.h"

/*#inlcude"cvaux.h"//experimentalstuff(ifneed)*/

#include"highgui.h"

(三)配置项目:

每创建一个将要使用OpenCV的VCProject,都需要给它指定需要的lib。

菜单:

Project->Settings,然后将Settingfor选为AllConfigurations,然后选择右边的link标签,在Object/librarymodules附加上

cxcore.libcv.libml.libcvaux.libhighgui.libcvcam.lib

如果你不需要这么多lib,你可以只添加你需要的lib。

具体说明:

选择菜单"Project"->"Settings..."以激活项目配置对话框,在左边选择你的项目。

●调节设置,对Release和Debug配置都有效:

1)选择"SettingsFor:

"->"AllConfigurations"

2)选择"C/C++"标签->"Preprocessor"category->"AdditionalIncludeDirectories:

"。

加入用逗号分隔的相对路径(对文件.dsp而言)或绝对路径opencv\cxcore\include,opencv\cv\include,opencv\otherlibs\highgui以及可选的optionally,opencv\cvaux\include。

3)选择"Link"标签->"Input"category->"Additionallibrarypath:

".加入输入库所在的路径(cxcore[d].libcv[d].libhihghui[d].libcvaux[d].lib)

●调节"Debug"配置

1)选择"SettingsFor:

"->"Win32Debug"。

2)选择"Link"标签->"General"category->"Object/librarymodules"。

加入空格分隔的cvd.lib,highguid.lib,cvauxd.lib(cvauxd.lib可选)

3)可以改变输出文件的名称和位置。

如想把产生的.exe文件放置于项目目录而不是Debug/子目录下,可在"Link"tab->"General"category->"Outputfilename:

"中键入./d.exe

●调节"Release"配置

1)选择"SettingsFor:

"->"Win32Release".

2)选择"Link"标签->"General"category->"Object/librarymodules".加入空格分隔的cv.lib,highgui.lib,cvaux.lib(cvaux.lib可选)

3)另外,你也可以改变.exe文件名。

键入./.exe到"Link"标签->"General"category->"Outputfilename:

"。

就这么多,可以编译并且运行一切了。

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

6如何读入和显示图像

#include"cv.h"/*OpenCV的基本函数头文件*/

#include"highgui.h"/*OpenCV的图像显示函数头文件*/

intmain(intargc,char**argv)

{

IplImage*img;/*定义IplImage指针变量img*/

if(argc==2&&(img=cvLoadImage(argv[1],1))!

=0)

{

cvNamedWindow("Imageview",1);/*定义一个窗口名为Imageview的显示窗口*/

cvShowImage("Imageview",img);/*在Imageview窗口中,显示img指针所指的图像*/

cvWaitKey(0);//非常重要,内部包含事件处理循环

cvDestroyWindow("Imageview");

cvReleaseImage(&img);

return0;

}

return-1;

}

1)图像载入函数

IplImage*src="/cvLoadImage"("lena.jpg",-1);/*定义IplImage指针变量src,并且将src指向当前目录下的图像lena.jpg*/

函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。

函数支持bmp、jpg、png、tiff等格式的图像。

其函数原型如下:

IplImage*cvLoadImage(constchar*filename,intiscolor);

其中,filename是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。

2)窗口定义函数

cvNamedWindow("src",CV_WINDOW_AUTOSIZE);/*定义一个窗口名为src的显示窗口*/

函数cvNamedWindow定义一个窗口,用于显示图像。

其函数原型如下:

intcvNamedWindow(constchar*name,unsignedlongflags);

其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。

CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。

3)图像显示函数

cvShowImage("src",src);/*在src窗口中,显示src指针所指的图像*/

函数cvShowImage是在指定的窗口中显示图像,其函数原型如下:

voidcvShowImage(constchar*name,constCvArr*image);

其中,name是窗口名称,image是图像类型指针,一般是IplImage指针。

4)图像保存函数

函数cvSaveImage以指定的文件名保存IplImage类型的指针变量,其函数原型如下:

intcvSaveImage(constchar*filename,constCvArr*image);

其中,filename是图像保存路径和名称,image是IplImage指针变量。

说明:

函数cvSaveImage保存图像到指定文件。

图像格式的的选择依赖于filename的扩展名,请参考cvLoadImage。

只有8位单通道或者3通道(通道顺序为'BGR')可以使用这个函数保存。

如果格式,深度或者通道不符合要求,请先用cvCvtScale和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。

5)图像销毁函数

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

其函数原型如下:

voidcvReleaseImage(IplImage**image);

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

6)等待按键事件cvWaitKey

intcvWaitKey(intdelay=0);

delay

延迟的毫秒数。

函数cvWaitKey无限制的等待按键事件(delay<=0时);或者延迟"delay"毫秒。

返回值为被按键的值,如果超过指定时间则返回-1。

注释:

这个函数是HighGUI中唯一能够获取和操作事件的函数,所以在一般的事件处理中,它需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中。

7如何访问图像像素

(坐标是从0开始的,并且是相对图像原点的位置。

图像原点或者是左上角(img->origin=IPL_ORIGIN_TL)或者是左下角img->origin=IPL_ORIGIN_BL))

●假设有8-bit1-通道的图像I(IplImage*img):

●假设有8-bit3-通道的图像I(IplImage*img):

例如,给点(100,100)的亮度增加30,那么可以这样做:

或者更高效地:

●假设有32-bit浮点数,1-通道图像I(IplImage*img):

●现在,一般的情况下,假设有N-通道,类型为T的图像:

你可以使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc)

I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c)

也有针对各种图像(包括4通道图像)和矩阵的函数(cvGet2D,cvSet2D),但是它们非常慢。

8如何访问矩阵元素

typedefstructCvMat

{

inttype;

intstep;

/*forinternaluseonly*/

int*refcount;

inthdr_refcount;

union

{

uchar*ptr;

short*s;

int*i;

float*fl;

double*db;

}data;

#ifdef__cplusplus

union

{

introws;

intheight;

};

union

{

intcols;

intwidth;

};

#else

introws;

intcols;

#endif

}CvMat;

方法是类似的(下面的例子都是针对0起点的列和行)

●设有32-bit浮点数的实数矩阵M(CvMat*mat):

M(i,j)~((float*)(mat->data.ptr+mat->step*i))[j]

●设有64-bit浮点数的复数矩阵M(CvMat*mat):

ReM(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2]

ImM(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2+1]

●对单通道矩阵,有宏CV_MAT_ELEM(matrix,elemtype,row,col),例如对

32-bit浮点数的实数矩阵:

M(i,j)~CV_MAT_ELEM(mat,float,i,j),

例如,这儿是一个3x3单位矩阵的初始化:

CV_MAT_ELEM(mat,float,0,0)=1.f;

CV_MAT_ELEM(mat,float,0,1)=0.f;

CV_MAT_ELEM(mat,float,0,2)=0.f;

CV_MAT_ELEM(mat,float,1,0)=0.f;

CV_MAT_ELEM(mat,float,1,1)=1.f;

CV_MAT_ELEM(mat,float,1,2)=0.f;

CV_MAT_ELEM(mat,float,2,0)=0.f;

CV_MAT_ELEM(mat,float,2,1)=0.f;

CV_MAT_ELEM(mat,float,2,2)=1.f;

9如何在OpenCV中处理我自己的数据

设你有300x20032-bit浮点数image/array,也就是对一个有60000个元素的数组。

intcols=300,rows=200;

float*myarr=newfloat[rows*cols];

//第一步,初始化CvMat头

CvMatmat=cvMat(rows,cols,

CV_32FC1,//32位浮点单通道类型

myarr//用户数据指针(数据没有被复制)

);

//第二步,使用cv函数,例如计算l2(Frobenius)模

doublenorm=cvNorm(&mat,0,CV_L2);

...

deletemyarr;

其它情况在参考手册中有描述。

见cvCreateMatHeader,cvInitMatHeader,cvCreateImageHeader,cvSetData等

10.例程

10.1Kalman滤波进行旋转点的跟踪

下面是程序所用到的主要的三个函数(完整程序见kalman):

CreateKalman

分配Kalman滤波器结构,设置A,B,Q,R的初始状态

CvKalman*kalman=cvCreateKalman(2,1,0);

CvKalman*cvCreateKalman(intdynam_params,intmeasure_params,intcontrol_params=0);

dynam_params

状态向量维数

measure_params

测量向量维数

control_params

控制向量维数

函数cvCreateKalman分配CvKalman以及它的所有矩阵和初始参数

KalmanPredict

估计后来的模型状态

constCvMat*prediction=cvKalmanPredict(kalman,0);

constCvMat*cvKalmanPredict(CvKalman*kalman,constCvMat*

control=NULL);

#definecvKalmanUpdateByTimecvKalmanPredict

kalman

Kalman滤波器状态

control

控制向量(uk),如果没有外部控制(control_params=0)应该为NULL函数cvKalmanPredict根据当前状态估计后来的随机模型状态,并存储于kalman->state_pre:

其中:

x'k是预测状态(kalman->state_pre),

xk-1是前一步的矫正状态(kalman->state_post),应该在开始的某个地方初始化,

即缺省为零向量,

uk是外部控制(control参数),

P'k是先验误差相关矩阵(kalman->error_cov_pre)

Pk-1是前一步的后验误差相关矩阵(kalman->error_cov_post),应该在开始的某个地方初始化,即缺省为单位矩阵。

函数返回估计得到的状态值。

KalmanCorrect

调节模型状态

cvKalmanCorrect(kalman,measurement);

constCvMat*cvKalmanCorrect(CvKalman*kalman,constCvMat*measurement);

#definecvKalmanUpdateByMeasurementcvKalmanCorrect

kalman

被更新的Kalman结构的指针

measurement

指向测量向量的指针,向量形式为CvMat

函数cvKalmanCorrect在给定的模型状态的测量基础上,调节随机模型状态:

其中:

zk-给定测量(mesurementparameter)

Kk-Kalman"增益"矩阵

函数存储调节状态到kalman->state_post中并且输出时返回它。

跟踪算法与程序代码分析:

1)产生一个kalman滤波器,初始化A,H,Q,R.

X(k)=AX(k-1)+BU(k)+W(k),Z(k)=HX(k)+V(k),X(k)是k时刻的系统状态,U(k)是k时刻对系统的控制量。

A和B是系统参数,对于多模型系统,他们为矩阵。

Z(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为矩阵。

W(k)和V(k)分别表示过程和测量的噪声。

他们被假设成高斯白噪声(WhiteGaussianNoise),他们的covariance分别是Q,R。

初始化滤波器的初始状态(随机),得到初始状态的角度,横纵座标:

CvKalman*kal

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1