【doc】C++Builder下基于OpenCV的数字图像处理
C,,Builder下基于OpenCV的数字图像
处理
第29卷第4期
V01.29NO.4
计算机工程与设计
ComputerEngineeringandDesign
2008年2月
Feb.2008
C++Builder下基于OpenCV的数字图像处理
方玫,喻擎苍,李华强
(浙江理工大学信息电子学院,浙江杭州310018)
摘要:详细地介绍了用于数字图像处理的开放源代码的计算机视觉类库——0pe
?cV.利用OpenCV中的数字图像处理函数
使复杂的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
变得简单化.介绍了OpenCV的特点及功能,对最新版本的OpenCV
新增的功能作了详细的论述,并且讨论了在
C++Builder环境下如何配置OpenCV,最后在此基础上给出了两个应用实例.对数
字图像处理的研究具有一定的实用价值.
关键词:数字图像;开放源代码;计算机视觉;配置;编程
中图法分类号:TP391.41文献标识码:A文章编号:1000.7024(2008)04.0882.03 DigitalimageprocessingbasedonOpenCVinC++Builder FANGMei,YUQing—cang,LIHua—qiang
(CollegeofInformationandElectronics,ZhejiangSci-TechUniversity,Hangzhou310018,
China)
Abstract:Opensourcecomputervisionlibrary(OpenCV)isdiscussedindetail.whichcarlbe
usedindigitalimageprocessing.It
carlmaketheproblemseasierusingthefunctionofdigitalimageprocessinginOpenCV.Firstl
y,thecharacteristicsandfunctionofthe
OpenCVareintroduced.Secondly,thenewcharacteristicsofthelatesteditionofOpenCVare
presentedindetail,andhowtosetthe softwareenvironmenttomakeitworkinC++Builderisdiscussed.Atlast,thetwoexamplesba
sedonOpenCVareshown.Ithasreal usefulfordigitalimageprocessingresearch. Keywords:digitalimage;opensource;computervision;configuration;program
0引言1OpenCV介绍
近年来,无论在生活还是工程运用中涉及到的图像绝大
多数是数字图像.它是用一个数字阵列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示的,该阵列的每
个元素称为像素,该像素是组成数字图像的基本元素,按照某
种规律编程一系列二进制数码(0和1)来表示图像上的每个
点,所以又被称为离散图像[I-2].对数字图像的处理已广泛运
用于工业,微生物,医学,航空航天及国防等领域.
随着数字图像处理的日益广泛,数据量大,处理时间长和
速度慢等缺点也显现出来.虽然随着处理器速度和内存容量
的指数式增长,上述的问题有所改善,但还是相当突出.所以
研究者不断地开发出图像处理的高效算法及图像处理的软件
包.文献[3】对目前的图像处理软件包作了比较详细的比较,这
些软件包对计算机图像处理和计算机视觉的研究提供很大的
便利.但是也存在着很多的缺点:?大多数软件包没有高级数
学计算函数;(~)MatLab是图像处理很好的软件,但是它的运行
速度是不能忍受的;?绝大多数软件包不支持可嵌入性等.
本文主要介绍OpenCV(opensourcecomputervisionlibrary)
图像处理的特点,以及它在BorlandC++Builder环境下的配置,
最后给出了两个实例.
开放源代码的计算机视觉类库OpenCV是由Intel公司位
于俄罗斯的研究实验室开发出来的".为了考虑计算的速度,
大多数图像处理的软件包是用c/c++编写的,OpenCV也不
例外.它是由300多个c函数和c++类所组成的库,在IPL
(imageprocessinglibrary)基础上发展而来的.主要由4个模块 组成:~cv:主要的OpenCV函数;(~cvaux:辅助性的o【H1Cv函数; @zxcore:数据结构与线性代数支持;~highgu~..图像界面函数. 1.1OpenCV特点
虽然文献[4.6】都提到了OpenCV的特点,但是都没有对其 进行系统地描述总结,本文对其特点进行了归纳总结,如下: (1)具有良好的独立性.包含了300多个c函数和c++类, 不依赖于外部库,即可以独立运行,也可以在运行时使用其它 外部库.
(2)具有良好的跨平台性.OpenCV是由跨平台的中,高层 API构成,为程序员提供了能在很多平台上都适用的移植性好 的算法基础操作,很好地支持Windows,Linux,Unix及Mac OSX等操作系统,可以在大多数的c/c++编译器下工作,如: MSVC++6.0,MSVC++.NET2003,MSVC++.NET2005和Bor. 收稿日期:2007—03—08E.mail:lionli2005@163.tom
基金项目:国家自然科学基金项目(5o575211). 作者简介:方玫(1982一),女,浙江金华人,硕士研究生,研究方向为计算机视觉与数
字图像处理;喻擎苍(1967一),男,副教授,研究方向
为立体视觉和机器理解:李华强(1982一),男,硕士研究生,研究方向为计算机视觉
与数字图像处理.
?——
882?——
landC++Builder等,可以作为二次开发的理想工具. (3)具有丰富的图像处理函数.OpenCV包含了列表,队 列,集合,图等基本的数据结构;求特征值,奇异值等的矩阵 和向量及线性代数的操作;图像滤波,边缘检测,角点检测, 数学形态学操作等的基本数字图像处理;还包括对图像的高 级处理,如特征检测与跟踪,运动分析,目标分割与识别以及
3D重建等.
(4)处理速度快.OpenCV中的算法都是基于封装于IPL 的具有很高灵活性的动态数据结构,基于Intel处理器指令集 开发的优化代码,所以处理的速度相当快.而且还提供了一 些与诸如Eic,Ch,MatLab等其它语言或环境的结构,这些接口 在其安装后位于opencv/interaces目录下.
(5)具有开放性.OpenCV不论对商业还是非商业都是免 费的,而且它的代码也是公开的,研究者可以对它的源代码进
,这样自己的代码 行修改,也可以把自己研发的新类库加进去
也可能被别人广泛使用.
使用OpenCV库可以编写出简洁而且高效的代码来解决 数字图像处理和计算机视觉编程中的问题,这样不仅降低了 程序员开发程序的难度,而且缩短了相关程序的开发周期. 1.2OpenCV最新版本
目前最新版本是2006年ll1月发布的OpenCV1.0版本. 包含了很多的新特性,支持了新的编译器/环境:GCC4.x,Vi. sualStudio.NET2005,还扩充了大量的函数".
CV模块:增加了cvGetAffineTransform,cvWatershed,cvPyr.
MeanShifiFiltering函数;扩展了cvDistTransfoITn,cvThresh,
cvCanny(使用真实梯度)函数;所有的滤波函数被重新写过,为 线性可分不可分滤波增加了新的c++类.
cvaux模块:增加了新的大型视频监控模块,并完善了智 能目标跟踪功能.
cxcore模块:增加了cvMixChannels,cvRandShuffie,
cvRange,cvCalcPCA,cvProjectPCA,cBackProjectPCA,cvGetTh— readNum,cvGetNumThreads,cvSetNumThreads,cvNormalize,
cvReduce函数;扩展了cvCalcCovarMatrix,cvMulTransposed函 数;为Cvlmage和CvMatrix增加c++类;矩阵的最大通道数增 加到了64个,尽管只有一些特殊函数才处理这样的图像.
highgui模块:所有的视频捕捉的代码在结构上重新构造 并且按模块划分,采用了更好的函数名字;增加了对Quicktime
(MacOSX)和Xine(Linux)的支持.
此外,对与角度有关的API函数的返回值进行了修改,新 版本都用角度而不是以前的用弧度返回;增加了ML(机器学 习)的类库,这是一个全新的为统计分类,回归以及聚类而写 的c++类库;应用新的IPP5.1功能,cvSobel,cvLaplace等函数 都被大大地优化.
1.3OpenCV的数据结构
OpenCV设计了一些基础数据类型和帮助数据类型.基 础数据类型有:图像类的Ipllmage;矩阵类的CvMat;可变集合 类的CvSeq,CvSet;以及多维柱状图混合类CvHistogram.帮助 数据类型有:表示二维点坐标的CvPoint;表示迭代过程结束 的CvTermCriteria;表示图像转换内核的IplConvKemel.在基 础类中最常用的是Ipllmage类,下面就对其详细介绍,其它类 的介绍请参考文献[8】.
Ipllmage类的具体定义如下:
typedefstruct_Ipllmage{ intnSize;Ipllmage大小/
intID;图像头的版本/
intnChannels;/通道数,根据不同颜色的位图支持l,2, 3或4个通道/
intalphaChannel;被OpenCV忽略/
intdepth;像素的位深度:IPL_DEPTH_ 8U,IPL—
DEPTH_
8S,IPL_
DEPTH_
16U,IPL_
DEPTH_
16S,IPL—
DE-
PTH32S,IPLDEPTH32EIPLDEPTH64F可支持/ charcolorModel[4];被OpenCV忽略/
charchannelSeq[4];同上/
intdataOrder;/*0.交叉存取颜色通道,1.分开的颜色 通道.只有cvCreatelmage可以创建交叉存取图像/ intorigin;/*0.顶一左结构,1.底一左结构(windOW Sbitmaps风格)/
intalign;图像行排列(4or8).OpenCV忽略它,使 用widthStep代替/
intwidth;图像宽像素数/
intheight;图像高像素数/
structIplROI*roi;/图像感兴趣区域.当该值非空只对 该区域进行处理/
struct_
IpllmagemaskROI;在OpenCV中必须置NULL/ voidimageld;同上/
structIplTilelnfotilelnfo;同上/
intimageSize;图像数据大小(交叉存取格式下ima- geSize=image->heightimage->widthStep),单位字节/ char*imageData;指向排列的图像数据/
intwidthStep;排列的图像行大小,以字节为单位/ intBorderMode[4];边际结束模式,被OpenCV忽略/ intBorderConst[4];同上/
charimageDataOrigin;指针指向一个不同的图像数据结 构(不是必须排列的),是为了纠正图像内存分配准备的/ }Ipllmage;
1.4OpenCV数据存取方式
OpenCV数据的存取方式有3种情况:间接存取方式;直 接存取方式;带指针直接存取方式.第1种方法速度较慢,后 两种速度较快.
下面对直接存取方式做一下简要的介绍.假设图像定义 为Ipllmageimg,不同类型的图像元素存取方式为: (1)对8-bit,1.通道的图像I像素(f,)的存取操作为: /(i.j)~((uchar)(img->imageData+iimg->widthStep))[j];
(2)对8-bit,3.通道的图像I像素(f,,)的存取操作为: f,-((uchar)(img->imageData+iimg->widthStep))【j img.>nChannels+0];//Blue分量
/(i,j)6~((uchar)(img->imageData+iimg->widthStep))【j img.>nChannels+1];//Green分量
I(i,j)~-((uchar)(img一>imageData+iimg->widthStep))【j img->nChannels+2];//Red分量
?——
883?——
2OpenCV在C++Builder环境下的配置
在2006年l1月最新发布的版本中取消了对Borlandc斗_卜 的支持,但是仍然有一个脚本文件utils\gen_ make.PY可以通过
生成文件makefile.bcc'S来编译.本文介绍通过转换静态链接 库的方法在C++Builder环境下进行配置.
OpenCV的静态库对MSVC来讲可以直接使用,但是在 C++Builder环境下不能直接使用,必须进行转换.在c斗_卜Buil— der安装目录的Bin目录下的coff2omf.exe文件,可以将MSVC 的静态库转换成C++Builder类的静态库.
具体方法为:
colT2omf[path:]MSVC库文件(.1ib)[path:]C++Builder库文
件(.1ib)
接着对OpenCV进行环境配置.打开C++Builder6.0,选择 菜单Project中的Options,在对话框中选择Directories/Conditio— nals标签,在IncludePath中添加OpenCV的头文件所在的路 径.同时在LibraryPath中添加用上述方法转换而来的静态链 接文件的路径.最后在C++Builder工程中加入OpenCV的库 文件.选择菜单View中的ProjectManager,选择Add添加用 上述方法转换而来的静态连接文件.至此完成了OpenCV在 c-Builder6.0下的配置工作,就可以使用OpenCV了. 3图像编程实例
了解了OpenCV的数据结构,数据存取方式和环境配置, 下面给出两个实际的数字图像处理的实例.以下两个例子均 在BorlandC++Builder6.0环境下编程实现.
3.1实例1
本实例利用OpenCV实现物体轮廓边缘提取.可以直接 调用OpenCV中的cvCanny函数检测边缘,用cvLoadlmage加 载要处理的图像,用cvNamedWindow创建显示图像的窗体, 最后用cvShowlmage显示图像.要注意的是须在程序头加上 头文件cv.h及highgui.h.'
原图及边缘提取结果如图1所示.
3.2实例2
本实例利用OpenCV实现人脸的定位.如果不借助于任 何软件包,程序员自己编程实现人脸定位的话,主要是依据人 脸中的某些特征,如眼睛,嘴巴等,这个工作是非常繁琐而且 比较困难的.现在利用OpenCV中的cvHaarDetectObjects函数 检测图像中的目标能快速地实现对人脸的定位.同样需要在 程序头加上头文件CV.h及highgui.h.原图及人脸定位结果如 图2所示.
4结束语
(a)原图(b)人脸定位结果
图2人脸定位实例
由上述实例可以看出,利用OpenCV中的数字图像处理 函数使得问题变得简单,很有实用价值,对缩短程序开发的周 期有着十分显着的作用.而且OpenCV是免费开放源代码的, 程序员可以修改其源代码,更是有助于理解.OpenCV在雅虎 上有个专门的讨论组,对程序员运用中遇到的问题与实际经验 进行讨论.当今数字图像处理已经广泛运用到生活的各个领 域中,OpenCV发挥着不可替代的作用,并且它又在不断地更 新中,随着其不断地完善,将在更多的领域发挥更大的作用. 参考文献:
[1】朱虹.数字图像处理基础[M】.北京:科学出版社,2005. [2】杨淑莹.Vc++图像处理程序设计[M】.北京:北方交通大学出版 社,清华大学出版社,2003.
[3】喻擎苍,翁秀娟,赵匀,等.交互式开放结构计算机视觉平台[J]. 计算机工程与应用,2006,42(23):78_81. [4】黎松,平西建,丁益洪.开放源代码的计算机视觉类库OpenCV 的应用[J].计算机应用与软件,2005,22(8):134—136. [5】刘洁,冯贵玉,张汗灵.一种图像处理的计算机视觉的开发工具 [J】.计算机仿真,2006,23(11):305—307.
[6】吕学刚,于明,刘翠响.IPL和OpenCV在Vc++环境下的应用 [J】.微电脑应用,2003,19(1):33—34.
[7】China—Vision[EB/0L】.—vision.net/technology/
soft/200701/4283.htm1.
[8】Intel~OpenSourceComputerVisionLibrarReferenceManuals
[EB/0L】.2003.
英文摘要书写要求
摘要写得好,能起到帮助读者了解
论文
政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载
主要内容的作用.因此,必须 对论文进行认真的主题分析,找出论文的主题概念,简明,准确,完整地写
出摘要.
英文摘要一般是中文摘要的转译,其书写要求如下:
(一)内容要求
(1)文摘由3部分组成:研究的问题,方法和
措施
《全国民用建筑工程设计技术措施》规划•建筑•景观全国民用建筑工程设计技术措施》规划•建筑•景观软件质量保证措施下载工地伤害及预防措施下载关于贯彻落实的具体措施
,得出的结果或结论;与 此无关的内容均可省略.英文摘要一一般不超过150个英文单词. _——
884-——
(2)取消或减少背景信息,知识介绍,论文中谈及的未来
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
不纳入摘要, 在引言中出现的内容不要写入摘要.
(3)不要对论文内容作评论,尤其是自我评价,也不要说别人的缺点. (二)翻译要求
(1)尽量采用被动语态,用第三人称,不用"We"等第'人称作主语:用过 去时态叙述作者工作,用现在时态叙述结论.
(2)尽量用短句子,动词尽可能靠近主语.
(3)尽量用词义清楚并为人熟知的词,不用自己无把握的难词;可省去不 必要的词语,诸如副词,形容词,"Inthispaper"等.
?一
?