OpenCV使用说明Word文档下载推荐.docx
《OpenCV使用说明Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《OpenCV使用说明Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
轮廓处理,几何形状计算,平面划分
运动分析:
对象跟踪,对象检测,相机定标,三维重建,分类器设计
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,在下方填入路径:
\ProgramFiles\OpenCV\cxcore\include
\ProgramFiles\OpenCV\cv\include
\ProgramFiles\OpenCV\cvaux\include
\ProgramFiles\OpenCV\ml\include
\ProgramFiles\OpenCV\otherlibs\highgui
\ProgramFiles\OpenCV\otherlibs\cvcam\include
然后选择sourcefiles,在下方填入路径:
\ProgramFiles\OpenCV\cv\src
\ProgramFiles\OpenCV\cxcore\src
\ProgramFiles\OpenCV\cvaux\src
\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会创建一个项目目录(缺省情况下,目录名就是项目名),<
projectname>
.dsp文件以及<
.dsw,.ncb等,如果你创建自己的workspace。
(二)添加文件到project中:
1)选择菜单"
Files"
。
2)选择"
C++SourceFile"
键入文件名,点击"
3)增加OpenCV相关的头文件目录:
#include"
cv.h"
/*#inlcude"
cvaux.h"
//experimentalstuff(ifneed)*/
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"
Additionallibrarypath:
.加入输入库所在的路径(cxcore[d].libcv[d].libhihghui[d].libcvaux[d].lib)
●调节"
Debug"
配置
1)选择"
Win32Debug"
2)选择"
General"
Object/librarymodules"
加入空格分隔的cvd.lib,highguid.lib,cvauxd.lib(cvauxd.lib可选)
3)可以改变输出文件的名称和位置。
如想把产生的.exe文件放置于项目目录而不是Debug/子目录下,可在"
tab->
Outputfilename:
中键入./<
exe-name>
d.exe
Release"
Win32Release"
.
.加入空格分隔的cv.lib,highgui.lib,cvaux.lib(cvaux.lib可选)
3)另外,你也可以改变.exe文件名。
键入./<
.exe到"
就这么多,可以编译并且运行一切了。
在设置完编译环境后,针对OpenCV函数库的一些基本图像函数,利用下面的例子分别从图像的载入、显示和基本的图像处理方面介绍OpenCV的具体用法。
6如何读入和显示图像
/*OpenCV的基本函数头文件*/
/*OpenCV的图像显示函数头文件*/
intmain(intargc,char**argv)
{
IplImage*img;
/*定义IplImage指针变量img*/
if(argc==2&
&
(img=cvLoadImage(argv[1],1))!
=0)
{
cvNamedWindow("
Imageview"
1);
/*定义一个窗口名为Imageview的显示窗口*/
cvShowImage("
img);
/*在Imageview窗口中,显示img指针所指的图像*/
cvWaitKey(0);
//非常重要,内部包含事件处理循环
cvDestroyWindow("
);
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指针所指的图像*/
函数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
introws;
intheight;
};
intcols;
intwidth;
#else
#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->
step*i))[j*2]
ImM(i,j)~((double*)(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结构的指针
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