公路路面自动检测系统设计毕业设计论文.doc

上传人:laozhun 文档编号:2651505 上传时间:2023-02-21 格式:DOC 页数:30 大小:1.22MB
返回 下载 相关 举报
公路路面自动检测系统设计毕业设计论文.doc_第1页
第1页 / 共30页
公路路面自动检测系统设计毕业设计论文.doc_第2页
第2页 / 共30页
公路路面自动检测系统设计毕业设计论文.doc_第3页
第3页 / 共30页
公路路面自动检测系统设计毕业设计论文.doc_第4页
第4页 / 共30页
公路路面自动检测系统设计毕业设计论文.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《公路路面自动检测系统设计毕业设计论文.doc》由会员分享,可在线阅读,更多相关《公路路面自动检测系统设计毕业设计论文.doc(30页珍藏版)》请在三一办公上搜索。

1、目 录摘 要2ABSTRACT2ABSTRACT3第1章 绪论41.1 课题背景与实际意义41.2 国内外公路发展现状41.3 本毕业设计的主要内容51.4 本毕业设计的技术路线61.4.1 系统中用到的关键技术61.4.2 系统的硬件平台61.4.3 系统的软件平台61.4.4 程序实现6第2章 图像的预处理62.1 图像格式的识别62.2 相关函数介绍92.3 转化成灰度图162.4 灰度图像二值化162.5 图像的梯度锐化162.6去除离散的杂点噪声172.7 整体倾斜度调整172.8 字符分割182.9图像的归一化处理192.10图像的紧缩重排192.11特征提取19第3章进行数字识别

2、233.1 BP神经网络简介233.2 BP网络的设计及其编程实现27第4章 “路面里程桩号识别系统”介绍294.1 总体逻辑结构304.2 整体运行界面及功能30 摘 要本文的研究是公路路面自动检测系统的一部分,最终完成的任务是提取并识别出采集到的路面里程标图片上的号码数字,研究了计算机图像处理技术在公路路面自动检测中的应用。本研究分析了对于公路路面图像处理所需解决的主要问题,提出了提取公路路面图像特征的技术方案;尝试综合多种图像处理技术对里程桩图片进行适当的预处理,包括灰度图转化,二值化,梯度锐化,去离散噪声,整体倾斜调整,字符分割,尺寸标准归一化和紧缩重排,最后对处理后的图片中所含号码进

3、行识别。整个软件系统采用面向对象的编程技术,用VC+6.0语言编写而成,且界面简明,易于操作。本系统可望应用于公路自动检测系统中对路标号码进行识别,为公路管理和养护部门的决策提供依据,同时对于类似的图像处理任务有借鉴意义。关键词 公路路面,识别,图像处理,图像分割 ABSTRACTThe objectives of this thesis are to recognize the number on road-surface-mileport. In this paper,the main problems of digital image processing for highway sur

4、face are analyzed particularly,and the efficient and integrated preprocessing algorithm of highway surface image is described,finally recognize the number on the image.In this software system,which is compiled by VC+6.0,the Object Oriented Program Technique was adopted. The interface is so laconic a

5、nd easy to operate .In addition,these algorithms in this research can be applied to analyze the road surface distress automatically,also be used for reference in other similar image processing cases.KEY WORDS:highway surface,recognize,image processing,image segmentation第1章 绪论1.1 课题背景与实际意义改革开放的产物许多人对

6、十几年前的“出行难”仍记忆犹新。交通部1990年的有关统计数字显示,因路况不好,车辆通行不畅,我国每年有上百亿元的财富被白白地浪费在汽车缓慢的行进中。80年代统计,全国公路汽车平均时速只有30多公里。交通滞后成为制约各地经济发展和对外开放的“瓶颈”。自1988年我国高速公路实现零的突破后,一条条以高速公路为轴线的各具特色的产业带迅速出现在各地。便捷通达的高速公路给人们的生活和工作带来了快节奏和高效率,加快了我国向现代文明社会发展的步伐。目前已建成的高速公路仅为需求里程的四分之一,我国高速公路建设仍处于滞后交通需求状态。去年以来,我国实施积极的财政政策,加强基础设施建设,对公路的投资超过了历史上

7、任何时期。从高速公路上流过的不仅仅是人流物流,而且是商业流、金融流、信息流、文化流,高速公路促进了沿线产业和经济带的发展。综上,公路的作用如此之大 ,因此后期的保养和维护工作也尤为重要,可应用公路路面状况自动检测系统来分析,路面里程桩号是公路位置的标志,把采集到包含里程号的图片信息输入到该系统中经自动识别获得所要的路段位置。1.2 国内外公路发展现状欧盟及欧共体各国为了发展区域性经济,更好地发挥高速公路的优势,加强国际间的联系,欧洲一些国家正在把高速公路连接起来,而构成国际高速公路网。如横贯全欧,东自奥地利的维也纳,经荷兰、法国、西至西班牙的瓦伦西亚全长3200km的高速公路;纵贯全欧,北至丹

8、麦的哥本哈根,经过德国和奥地利,南至意大利的罗马全长共有2100km的高速公路。可以说,每条高速公路都给欧洲乃至世界带来了巨大的社会效益和经济效益。美国的大规模建设开始于20世纪40年代,特别是二战后随着美国汽车工业和交通运输业的迅猛发展,美国高速公路建设得到了长足的发展,到今天为止,美国已经成为世界上高速高路最多、路网最发达、设备最完善的国家。纽约至洛杉矶高速公路全长4556km,堪称世界之冠。美国的高速公路服务配套设施极为完善,通过开发和应用交通监控和信息系统,可以对高速路上的车流量和车速等路况信息进行连续的检测,并通过中心计算机系统对这些信息进行处理,向公众发布实时的交通信息和根据交通状

9、况对公路出入口的时间参数和路面交通信号灯作出相应得调节,控制车流量、缓解交通压力避免塞车现象的发生,并在发生交通事故时,该系统凭借先进的通讯手段在极短的时间内协调医疗救助、消防和警察等有关部门的工作,将损失降低到最低的限度。随着已建成高速公路的投入使用和一些再建高速公路项目的陆续完工及投入使用,我国高速公路的运输规模正处于快速膨胀之中。如已经建成的世界银行批准列为第三批公路贷款项目的济青高速公路其路面汽车行驶速度可达120km/h,昼夜通行能力可达45万车次,取得了显著的经济效益和社会效益。近年来,交通部门在提高社会经济效益的同时,使公路网规划和设计工作步入了程序化、规范化及科学化的轨道。对解

10、决我国公路混合交通的问题,提高道路通行能力,改善投资环境,促进经济发展起到了积极的作用。1.3 本毕业设计的主要内容路面里程桩号识别系统从功能上可分为图像采集、图片预处理和数字识别三个子系统。系统总流程结构如图0-1所示: 进行识别 图片预处理图像采集 图0-1系统总流程图其中图像预处理的流程如图0-2所示:图像输入 灰度转化 图像二值化 倾斜调整 去离散噪声梯度锐化紧缩重排 归一化调整图像分割 特征提取图0-2图像预处理流程图 数字识别的具体流程如图0-3所示:字符特征输入识别并给出结果 该毕业设计主要是为了辨认识别路标图像中的数字而设计的,它通过对图片的一系列处理,最后识别得出图片中显示的

11、数字。1.4 本毕业设计的技术路线 1.4.1 系统中用到的关键技术本设计的理论基础是数字图像处理技术,实现平台是Visual C+6.0。1.4.2 系统的硬件平台 因为系统运行的过程当中,主要进行的都是图像处理,在这个过程当中要进大量的数据处理,所以处理器和内存要求比较高,CPU 要求主频在600hz 以(含600Hz),内存在128 兆以上(含128 兆)。1.4.3 系统的软件平台 系统可以运行于任何一台装有Windows98 、Windows2000 或者Windows XP 的机子上。程序调试时,需要使用Microsoft Visual C+ 6.0(SP6)。1.4.4 程序实现

12、 整个系统的程序实现分为图像预处理和数字识别两大模块。在图像预处理的过程当中,我们采用了许多图像处理的技术,最后把每个数字的特征提取出来。这些技术包括图像数据读取、图像的灰度化、二值化、图像的调整、离散噪声点的去除、字符的切分、图像的缩放、字符的细化、字符的平滑、图像的求梯度等图像处理技术,最后是数字字符特征的提取。其结果再利用神经网络(这里我们选用BP网络)进行字符识别。利用神经网络进行字符识别的过程主要包括网络的训练、数据的读取、字符的判定、结果的输出。第2章 图像的预处理2.1 图像格式的识别 要进行图像分析和处理首先就要得到图像的数据,这些数据包括图像的宽、高、每个象素点的颜色值。因为

13、每种文件都有它自己的存放格式,本程序采用的输入图像即为bmp位图。BMP(bitmap 的缩写)文件格式的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,是Windows 本身可以直接提供读取支持的位图文件格式。BMP 文件可用每象素1、4、8、16 或24 位来编码颜色信息,这个位数称作图像的颜色深度,它决定了图像所含的最大颜色数。一幅1-bpp(位每象素,bit per pixel)的图像只能有两种颜色。而一幅24-bpp 的图像可以有超过16 兆种不同的颜色。 一个典型BMP 文件的结构。以

14、256 色也就是8-bpp 为例,文件被分成四个主要的部分:一个位图文件头BITMAPFILEHEADER,一个位图信息头BITMAPINFOHEADER,一个调色板Palette和实际的位图数据ImageDate。第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER; 这个结构的长度是固定的,为14个字节(W

15、ORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:bfType:指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。bfSize:指定文件大小,包括这14个字节。bfReserved1,bfReserved2:为保留字,不用考虑bfOffBits:为从文件头到实际的位图数据的偏移字节数,即图1.3中前三个部分的长度之和。第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:typedef struct tagBITMAPINFOHEADERDWORD biSize; LONG biWidth;

16、 LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER; 这个结构的长度是固定的,为40个字节(LONG为32位整数),各个域的说明如下:biSize:指定这个结构的长度,为40。biWidth:指定图象的宽度,单位是象素。biHeight:指定图象的高度,单位是象素。biPlan

17、es:必须是1,不用考虑。biBitCount:指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图)。biCompression:指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。biSizeImage:指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:biSizeIm

18、age=biWidth biHeight要注意的是:上述公式中的biWidth必须是4的整倍数(所以不是biWidth,而是biWidth,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth=240;如果biWidth=241,biWidth=244)。如果biCompression为BI_RGB,则该项可能为零biXPelsPerMeter:指定目标设备的水平分辨率,单位是每米的象素个数。biYPelsPerMeter:指定目标设备的垂直分辨率,单位同上。biClrUsed:指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2bi

19、BitCount。biClrImportant:指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。第三部分为调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2biBitCount个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:typedef struct tagRGBQUAD BYTE rgbBlue; /该颜色的蓝色分量BYTE rgbGreen; /该颜色的绿色

20、分量BYTE rgbRed; /该颜色的红色分量BYTE rgbReserved; /保留值 RGBQUAD; 第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的R、G、B值。下面针对2色、16色、256色位图和真彩色位图分别介绍。对于2色位图,用1位就可以表示该象素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个象素。对于16色位图,用4位可以表示一个象素的颜色,所以一个字节可以表示2个象素。对于256色位图,一个字节刚好可以表示1个象素。对于真彩色图,三个字节才能表示1个象素。要注意两点:(1)每一行的字节

21、数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。(2)一般来说,.bMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素接下来是倒数第二行左边第一个象素,左边第二个象素依次类推 ,最后得到的是最上面一行的最右一个象素。 在图像预处理部分的图像数据读取部分,使用了微软提供的一个图像函数库dibapi.h和dibapi.cpp,里面已经含有一些基本的图像处理函数,在此就不再列举源代码,而紧紧将其接口加以描述,以使读者清晰每个函数的作用。同时对该库又加以扩充以满足本程序的需要。2.2 相关函数

22、介绍 所有的函数定义及声明位于dibapi.h、dibapi.cpp、mydiblib.h中。首先来看7个图像数据读取/存储/创建以及图像基本信息获取函数。图像数据读取/保存由函数ReadDIBFile、SaveDIB、FindDIBBits、DIBWidth、DIBHeight、DIBNumColors完成,其调用接口如下: (1)ReadDIBFile函数 函数原型: HDIB WINAPI ReadDIBFile(CFile& file); 参数: CFile& file - 要读取得文件文件CFile 返回值: HDIB - 成功返回DIB的句柄,否则返回NULL。 说明: 该函数将指

23、定的文件中的DIB对象读到指定的内存区域中。除文件头之外的内容都将被读入内存。HDIB即此内存区域的指针 (2)SaveDIB函数函数原型: BOOL WINAPI SaveDIB (HDIB hDib, CFile& file);参数: HDIB hDib - 要保存的DIB CFile& file - 保存文件CFile返回值: BOOL - 成功返回TRUE,否则返回FALSE或者CFileException说明: 该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。(3)FindDIBBits函数 函数原型: LPSTR WINAPI FindDIBBi

24、ts (LPSTR lpbi);参数: LPSTR lpbi - 指向DIB对象的指针返回值: LPSTR - 指向DIB图像象素起始位置说明: 该函数计算DIB中图像象素数据区的起始位置,并返回指向它的指针。注 LPSTR指针为指向字符串的32位的指针。在对256色图像进行象素操作时,可以用(BYTE*)或(unsigned char*)强制将其转换为8位的指针(4)DIBWidth函数 函数原型: DWORD WINAPI DIBWidth(LPSTR lpDIB) 参数: LPSTR lpbi - 指向DIB对象的指针 返回值: DWORD - DIB中图像的宽度 说明: 该函数返回DI

25、B中图像的宽度。对于Windows 3.0 DIB,返回BITMAPINFOHEADER 中的biWidth值;对于其他返回BITMAPCOREHEADER中的bcWidth值。(5)DIBHeight函数函数原型: DWORD WINAPI DIBHeight(LPSTR lpDIB)参数: LPSTR lpDIB - 指向DIB对象的指针返回值: DWORD - DIB中图像的高度说明: 该函数返回DIB中图像的高度。对于Windows 3.0 DIB,返回BITMAPINFOHEADER中的biHeight值;对于其他返回BITMAPCOREHEADER中的bcHeight值。(6)DI

26、BNumColors函数函数原型: WORD WINAPI DIBNumColors(LPSTR lpbi)参数: LPSTR lpbi - 指向DIB对象的指针返回值: WORD - 返回调色板中颜色的种数 说明: 该函数返回DIB中调色板的颜色的种数。对于单色位图,返回2,对于16色位图,返回16,对于256色位图,返回256;对于真彩色位图(24位),没有调色板,返回0。以上6个函数是在图像处理过程中读取/保存图像以及获取图像基本信息的6个最基本的函数。还有一个NewDIB函数是作者自己编写的,用来建立一个新的DIB。此函数非常有用,可以十分便利的根据所提供的要创建的位图的基本信息(高度

27、、宽度、颜色位数)来开辟内存,并自动完成位图信息头的填充工作。 (7)NewDIB函数其完整程序代码及注释介绍如下:/*函数名称: NewDIB()* 参数:* width - 将要创建DIB的宽* height- 将要创建DIB的高* biBitCount- 将要创建DIB的位数。比如,如果要创建256色DIB,则此值为8*返回值:* HDIB - 成功返回DIB的句柄,否则返回NULL。*说明:* 该函数指定宽、高、颜色位数来创建一个新的DIB,并返回其句柄*/HDIB WINAPI NewDIB(long width, long height,unsigned short biBitCo

28、unt) /计算新建的DIB每行所占的字节数 long dwindth = (width*biBitCount/8+3)/4*4; /新建的DIB调色板中表项的数目 WORD color_num; /通过输入的biBitCount值来确定调色板的表项数目 switch(biBitCount) /如果用1 bit来表示一个象素那么调色板中有两个表项 case 1: color_num=2;break; /如果用4 bit来表示一个象素那么调色板中有16个表项case 4:color_num=16;break; /如果用8bit来表示一个象素,那么调色板中得表项有256中(本程序大多采用这种形式)

29、case 8:color_num=256;break; /其他的情况调色扳中没有表项,即真彩位图default:color_num=0;break; /计算位图数据所占的空间 /dwindth *height为象素数据所占的空间 /40为位图信息头占的空间 /color_num*4为调色板的表项所占的空间(调色板每个表项占4各个字节) dwBitsSize = dwindth *height + 40 + color_num*4; /建立指向位图文件的指针 LPSTR pDIB; /申请存储空间,并建立指向位图的句柄 HDIB hDIB=(HDIB) :GlobalAlloc(GMEM_MOV

30、EABLE|GMEM_ZEROINIT, dwBitsSize); /如果申请空间不成功返回错误信息if (hDIB = 0)return NULL; /如果申请空间成功锁定内存,并将内存的指针传给pDIBpDIB = (LPSTR) :GlobalLock(HGLOBAL) hDIB); /建立指向位图信息头结构的指针LPBITMAPINFO lpmf = (LPBITMAPINFO)pDIB; /给位图信息头内的各个参量赋值 /指定位图信息头结构的大小为40字节lpmf-bmiHeader.biSize = 40; /指定新建位图的宽度lpmf-bmiHeader.biWidth = wi

31、dth; /指定新建位图的高度 lpmf-bmiHeader.biHeight = height; /位平面数必须为1 lpmf-bmiHeader.biPlanes = 1; /确定新建位图表示颜色是要用到的bit数 lpmf-bmiHeader.biBitCount = biBitCount; /是否进行压缩lpmf-bmiHeader.biCompression = 0; /新建的位图中实际的位图数据所占的字节数 lpmf-bmiHeader.biSizeImage = dwindth *height; /指定目标设备的水平分辨率lpmf-bmiHeader.biXPelsPerMete

32、r = 2925; /指定目标设备的垂直分辨率 lpmf-bmiHeader.biYPelsPerMeter = 2925; /新建图像实际用到的颜色数 如果为0则用到的颜色数为2的biBitCount次 lpmf-bmiHeader.biClrUsed = 0; /指定新建图像中重要的颜色数,如果为0则所有的颜色都重要lpmf-bmiHeader.biClrImportant= 0; /如果新建的图像中含有调色板,则接下来对调色板的各种颜色分量赋初始值if(color_num!=0)for(int i=0;ibmiColorsi.rgbRed =(BYTE)i;lpmf-bmiColorsi

33、.rgbGreen =(BYTE)i;lpmf-bmiColorsi.rgbBlue =(BYTE)i; /解除锁定 :GlobalUnlock(HGLOBAL) hDIB); /返回新建位图的句柄 return hDIB;以上的7个函数是打开、保存、创建位图以及获取位图基本信息的常用函数下面的4个函数是显示位图、清除屏幕、以及画框的函数。其中PaintDIB函数是微软函数库提供的,由DisplayDIB函数调用,在此不再列举源代码,只是提供调用接口的讲解。其他的3个编写的函数列出详细的源代码。(8)PaintDIB函数调用接口:函数原型BOOL WINAPI PaintDIB (HDC, L

34、PRECT, HDIB, LPRECT, CPalette* pPal);参数: HDC hDC - 输出设备DC LPRECT lpDCRect - 绘制矩形区域 HDIB hDIB - 指向DIB对象的指针 LPRECT lpDIBRect - 要输出的DIB区域 CPalette* pPal - 指向DIB对象调色板的指针返回值: BOOL - 绘制成功返回TRUE,否则返回FALSE。说明:该函数主要用来绘制DIB对象。其中调用了StretchDIBits()或者SetDIBitsToDevice()来绘制DIB对象。输出的设备由由参数hDC指定;绘制的矩形区域由参数lpDCRect指

35、定;输出DIB的区域由参数* lpDIBRect指定。(9)在屏幕上显示位图的DisplayDIB函数其完整源代码及注释介绍如下:/*函数名称:DisplayDIB参数:CDC* pDC-指向当前设备上下文(Divice Context)的指针HDIB hDIB-要显示的位图的句柄*/void DisplayDIB(CDC* pDC,HDIB hDIB)/锁定位图并获取指向位图的指针BYTE* lpDIB=(BYTE*):GlobalLock(hDIB);/ 获取DIB宽度和高度int cxDIB = :DIBWidth(char*) lpDIB);int cyDIB = :DIBHeight

36、(char*)lpDIB);/设置位图的尺寸CRect rcDIB,rcDest;rcDIB.top = rcDIB.left = 0;rcDIB.right = cxDIB;rcDIB.bottom = cyDIB;/设置目标客户区输出大小尺寸(在这里直接令其为位图的尺寸)rcDest = rcDIB;/清除屏幕ClearAll(pDC);/在客户区显示图像:PaintDIB(pDC-m_hDC,rcDest,hDIB,rcDIB,NULL);/解除锁定:GlobalUnlock(HGLOBAL)hDIB);(10)清除当前屏幕客户区内容的ClearAll函数其完整源代码及注释介绍如下:vo

37、id ClearAll(CDC *pDC)/设置清除区域CRect rect;rect.left =0;rect.top =0;rect.right =2000;rect.bottom =1000;/创建一白色画笔CPen pen;pen.CreatePen (PS_SOLID,1,RGB(255,255,255);pDC-SelectObject (&pen);/绘制一白色矩形以清除客户区pDC-Rectangle (&rect);/清除画笔:DeleteObject (pen);(11)画框函数DrawFrame其完整源代码及注释介绍如下:/*函数名称:DrawFrame参数:CDC* p

38、DC-指向当前设备上下文的指针HDIB hDIB-指向位图的句柄CRectLink charRect-一个元素为Crect类对象的链表unsigned int linewidth-指出框的宽度COLORREF color-指出框的颜色说明:调用此函数之前要先完成分割操作,否则无法在分割出来的字符外画框。进行分割、标准化操作之后会自动生成一个Crect链表。关于此链表的使用涉及到STL(Standard Template Library)技术,在后面字符分割一节有个简要的介绍。*/void DrawFrame(CDC* pDC,HDIB hDIB, CRectLink charRect,unsi

39、gned int linewidth,COLORREF color)/创建画笔CPen pen;pen.CreatePen (PS_SOLID,linewidth,color);pDC-SelectObject (&pen);/创建一个NULL画刷:SelectObject (*pDC,GetStockObject(NULL_BRUSH);CRect rect,rect2;/锁定位图句柄并获取其指针BYTE* lpDIB=(BYTE*):GlobalLock (HGLOBAL)hDIB);while(!charRect.empty()/从表头上得到一个矩形rect2=rect= charRec

40、t.front();/从链表头上面删掉一个charRect.pop_front();/坐标转换/注意,这里原先的rect是相对于图像原点(左下角)的,/而在屏幕上绘图时,要转换以客户区为原点的坐标rect.top =:DIBHeight (char*)lpDIB)-rect2.bottom;rect.bottom =:DIBHeight (char*)lpDIB)-rect2.top ;pDC-Rectangle (&rect);/解除锁定:GlobalUnlock (HGLOBAL)hDIB);至此,图像读取/保存/创建/显示/清除屏幕/画框等11个函数已介绍完毕。再提一下本程序自动刷新的实现。所谓自动刷新,即每当屏幕内容被遮挡或者说客户区需要重画的时候,根据OnPaint消息来自动的刷新客户区。这里我们使用OnPaint和OnDraw一起来实现自动刷新。代码如下:void CChildView:OnPaint() CPaintDC dc(this); OnDraw(&dc);/OnDraw函数void CChildView:OnDraw(CDC *pDC)/如果m_hDIB不为NULL,即表示已经加载了图像文件,那么重画客户区if(m_hDIB!=NULL) DisplayDIB(pDC,m_hDIB);2.3 转化成灰度图灰度图像是指只

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号