基于OpenCV界面软件设计课程论文WORD版.docx
《基于OpenCV界面软件设计课程论文WORD版.docx》由会员分享,可在线阅读,更多相关《基于OpenCV界面软件设计课程论文WORD版.docx(10页珍藏版)》请在冰豆网上搜索。
基于OpenCV界面软件设计课程论文WORD版
软件课程设计小论文
——基于OpenCV的图像处理界面程序设计
1、开发环境
1、OpenCV的安装及环境搭配
在VC6.0中利用OpenCV进行开发视觉,首先,需要将OpenCV正确的配置到VC开发环境中。
主要是设置预先编译的头文件的路径与动态链接库的路径。
OpenCV的安装和普通程序的安装没有什么不一样的,双击程序安装包选择安装目录一路安装下去就可以了,难点是在VC++6.0里的环境搭配。
(1)设置预编译的头文件选择C/C++【Tools】,在下拉菜单中选择Options,然后在Directorie中输入以下几项:
C:
\ProgramFiles\OpenCV\cv\includeC:
\ProgramFiles\OpenCV\otherlibs\highguiC:
\ProgramFiles\OpenCV\cxcore\includeC:
\ProgramFiles\OpenCV\otherlibs\cvcam\include
(2)设置链接库在VC编译器下,在Project菜单下选择setting,弹出对话框。
在Link按键下的Category下拉菜单中选择Input选项,在Object/LibraryModules输入框中输入cxcore.libcv.libhighgui.lib在Additionallibrarypath中,输入:
C:
\ProgramFiles\OpenCV\lib注意每个库之间用一个空格隔开。
或者直接在allconfigurations中的Object/librarymodules输入:
cv.libhighgui.libcxcore.lib(新版本需要)cvcam.lib(cxcore.libhighgui.lib是几乎所有OpenCV程序都要用到的函数库,分别封装了基本的函数和图形界面接口,cv.lib中封装了大量的图像处理函数,cvcam.lib中封装了很多针对视频流的处理函数)当前工程就可以使用OpenCV的函数了。
但是还不能运行使用OpenCV编写的程序,因为还缺少动态链接库这是可以将C:
\ProgramFiles\OpenCV\bin下的*.dll拷贝到工程中,但是为了避免每次建工程都必须拷贝可以将这一路径加入系统环境变量设置方法:
我的电脑—属性—高级—环境变量—path—加入C:
\ProgramFiles\OpenCV\bin。
2、算法选择分析
·光线补偿:
由于光线原因,所照的图像可能会存在光线不平衡的情况而造成色彩偏差,为了抵消这种整个图像中存在的色彩偏差,本系统采用的解决方法是:
将整个图像中的所有像素的亮度从高到低进行排列,取前5%的像素,然后线性放大,使这些像素的平均亮度达到255。
实际上就是调整图片像素的RGB值。
·图像灰度化:
图像灰度化是将图像变成灰色,本系统中采用以下步骤来实现图像的灰度化:
彩色转换成灰度、灰度比例变换、灰度线性变换、灰度线性截断、灰度取反。
·高斯平滑:
在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。
但是如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清,为了既平滑掉噪声有尽量保持图像细节,本系统采用高斯平滑。
·均衡直方图:
使用该模块的目的是通过点运算使输入转换为在每一灰度级上都有相同的像素点数的输出图像。
它的实现主要是利用灰度均衡的转换式
DB=f(DA)=
H(u)du。
(式1)
·图像对比度增强:
为了将图像的特征一步一步显现出来,需要进行图像的对比度增强,它主要通过对图像的灰度值进行统计,对于小于Low则认为是有关的信息,则将它作为黑色处理,对于处于High以上的则认为是一些无关的信息,将它们去掉,而处于两者之间的,则进行对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。
二、简单图像的处理
1、图像打开显示,保存
A、新建MFC单文档工程,按照第二章中所提到的环境搭配方法进行环境搭配。
B、在Doc类中添加成员变量。
这一变量将用来接受存储打开的图片。
C、添加两个虚函数,分别用来打开图片文件和保存图片文件,分别添加OnOpenDocument,OnSaveDocument,并在这两个函数中添加代码,即可实现图像的打开,保存。
2、图像显示
①添加显示图片的代码,说到显示图片肯定是在View类中添加代码,显示图片的代码可以用OpenCV提供的已有的图像显示代码,但为了显示效果更好我加入了以前学过的图片双缓冲显示技术,图像的显示及双缓冲显示。
3、图像放大,缩小
找出主要实现代码。
通过分析核心函数为:
voidcvResize(constCvArr*src,CvArr*dst,intinterpolation=CV_INTER_LINEAR);这是OpenCV里专用来做图像大小变换的函数。
按照例程的调用方式在自己的工程中实现了一次简单的缩放。
4、图像旋转
通过查找资料后得知实现这一功能的OpenCV函数有:
voidcvGetQuadrangleSubPix(constCvArr*src,CvArr*dst,constCvMat*map_matrix);函数cvGetQuadrangleSubPix以子象素精度从图像src中提取四边形,使用子象素精度,并且将结果存储于dst,计算公式是:
dst(x+width(dst)/2,y+height(dst)/2)=src(A11x+A12y+b1,A21x+A22y+b2)
5、图像灰度化和二值化
三、系统设计
1.图像获取
从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
2、图像预处理
图像预处理就是对获取得来的图像进行适当的处理,使它具有的特征能够在图像中明显的表现出来。
该模块中的子模块有如下5个,下面对它们进行概述:
·光线补偿
因为系统得到的图片可能会存在光线不平衡的情况,这会影响我们对特征的提取,同时系统中要用到YcrCB色彩空间,所以有必要对图像进行光线补偿。
尽可能将它的特征在图像中表现出来。
YcrCB是一种色彩空间,它用于视频系统中,在该色彩空间中,Y分量表示像素的亮度,Cr表示红色分量,Cb表示蓝色分量,通常把Cr和Cb称为色度。
YcrCB色彩空间是以演播室质量标准为目标的CC601编码方案中采用的彩色表示模型。
·灰度变化
图像灰度化的过程就是把彩色图像转换为黑白色图像的过程,它也是为了将图像的信息更加具体、简单的表现出来,但是,这样做也将会丢失图像信息。
因此,尽可能在转化的过程中用简单的方式表现图像复杂的信息。
·高斯平滑处理
高斯平滑将对图像进行平滑处理,在图像采集过程中,由于各种因素的影响,图像往往会出现一些不规则的噪声,入图像在传输、存储等都有可能产生数据的丢失。
从而影响图像的质量。
处理噪声的过程称为平滑。
平滑可以降低图像的视觉噪声,同时出去图像中的高频部分后,那些本来不明显的低频成分更容易识别。
平滑可以通过卷积来实现。
经过卷积平滑后的水平投影后,二值化提供了较好的图像效果。
·对比度增强
对比度增强,就是对图像的进一步处理,将对比度再一次拉开。
它针对原始图像的每一个像素直接对其灰度进行处理的,其处理过程主要是通过增强函数对像素的灰度级进行运算并将运算结果作为该像素的新灰度值来实现的。
通过改变选用的增强函数的解析表达式就可以得到不同的处理效果。
·二值化
二值化的目的是将采集获得的多层次灰度图像处理成二值图像,以便于分析理解和识别并减少计算量。
二值化就是通过一些算法,通过一个阈值改变图像中的像素颜色,令整幅图像画面内仅有黑白二值,该图像一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像。
这便有利于我们对特征的提取。
该设计中采用组内方差和组外方差来实现二值化。
·直方图均衡
直方图均衡化的目的是使一输入图像转换为在每一灰度级上都有相同的象素点数,它的处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,它的研究思路是:
通过直方图变换式来进行直方图的均衡处理,直方图变换式是
但是直方图均衡化存在着两个缺点:
1)变换后图像的灰度级减少,某些细节消失;
2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
3、人脸定位
人脸定位是将典型的脸部特征(如眼睛,鼻尖,嘴唇等等)标记出来,在本系统中,定位的特征是眼睛,鼻尖和嘴巴三个。
由于眼睛具有对称性,因此可以很快就能标记出来,而鼻子是在眼睛下面,且嘴巴在鼻子下面,所以只要眼睛标记好,鼻子和嘴巴也能相应的标记出来。
4、识别
通过与库存中的特征向量进行比较,找出与特征最相近的参数,再对该参数进一步分析。
如果分析在我们所确认的范围内,我们就认为该人就是我们所要找的。
然后从库存中提取出该人相关的信息,并显示出来。
如果库存中没有,则给出提示是否对存库作为样本。
四、主要程序代码
//image.cpp:
Definestheentrypointfortheconsoleapplication.
#include"stdafx.h"
#include
#include
#include"image.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//Theoneandonlyapplicationobject
CWinApptheApp;
usingnamespacestd;
IplImage*image;
IplImage*copyimage;
staticCvHaarClassifierCascade*cascade=0;
staticCvMemStorage*storage=0;
constchar*cascade_name="haarcascade_frontalface_alt2.xml";
//先要将次文件从OpenCV\data\haarcascades文件夹中拷贝到项目文件夹中
voiddetect_and_draw(IplImage*img);//函数声明
int_tmain(intargc,_TCHAR*argv[])
{
cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);
//加载人脸检测所用的分类器
if(!
cascade)
{
fprintf(stderr,"ERROR:
Couldnotloadclassifiercascade\n");
return-1;
}
storage=cvCreateMemStorage(0);
//动态存储结构,用来存储人脸在图像中的位置
image=cvLoadImage("D:
\image\1.bmp");
if(!
image)return-1;
cvNamedWindow("OriginalImage",1);
cvShowImage("OriginalImage",image);
detect_and_draw(image);
//对加载的图像进行检测
cvWaitKey();
image=NULL;
cvDestroyWindow("Original");
cvDestroyWindow("result");
return0;
}
voiddetect_and_draw(IplImage*img)
{
staticCvScalarcolors[]=
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
};
doublescale=1.3;
copyimage=img;
IplImage*gray=cvCreateImage(cvSize(copyimage->width,copyimage->height),8,1);
cvCvtColor(copyimage,gray,CV_BGR2GRAY);
cvClearMemStorage(storage);
if(cascade)
{
/*函数cvHaarDetectObjects检测图像中的目标,由OpenCV提供。
*/
CvSeq*faces=cvHaarDetectObjects(gray,cascade,storage,1.1,2,CV_HAAR_DO_CANNY_PRUNING,
cvSize(20,20));
for(inti=0;i<(faces?
faces->total:
0);i++)
{
CvRect*r=(CvRect*)cvGetSeqElem(faces,i);
cvRectangle(copyimage,cvPoint(r->x,r->y),
cvPoint(r->x+r->width,r->y+r->height),CV_RGB(255,0,0),3);
}
}
cvNamedWindow("result",1);
cvShowImage("result",copyimage);
copyimage=NULL;
cvReleaseImage(&gray);
}
五、运行结果
六、心得体会
通过设计让我熟悉软件开发工具,如VisualC++6.0、opencv。
这个只要通过动手熟悉就可以了,通过上机操作让我清楚的感觉到开发工具的学习是要边看书边动手才学得快、学得牢。
而且要经常与其他人交流,能获得许多有用的信息。
不要怕将自己的作品演示给别人看,别人会帮助你检查出许多你意想不到的错误,开阔你的思路,检验你的设计思想,提出很多有用的建议。
这些建议往往是非常及时的,是你少走弯路,提高开发效率。
只有集思广益,善于借鉴,才能在最短的时间内完成最多的工作。
通过这次设计,一方面让我更进一步的熟悉和掌握了C++语言的基本语法以及更深入的了解了算法和VisualC++开发工具的使用。
另一方面在动手能力上有了很大的提高,以前学的知识只是“知识”,而现在是将“知识”转化成自身的本领,全面提高了自身解决具体问题的能力。