版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PAGE PAGE 43姓名学号成绩xxxx大学数字图像处理本科生课程论文论文题目:_车牌识别方法研究_ 完成时间:_2016年6月1日_所在专业:_软件工程_ 所在年级:_大三年级_基于MATLAB的车牌识别方法研究xxx级软件专业1班 xxx xx摘要:汽车车牌的识别是智能交通管理的重要组成部分之一。本文主要介绍车牌区域提取、字符切割、字符识别。车牌区域提取主要包括图像灰度图转化、图像边缘检测、灰度图腐蚀、图像平滑处理、边界值计算。字符切割主要包括图像去噪处理、图像膨胀和腐蚀处理。字符识别主要包括图像膨胀和腐蚀处理、字符归一化。关键词:MATLAB、车牌区域提取、字符识别、字符切割1 研究
2、背景随着经济社会的迅猛发展,人们的生活水平的提高,机动车辆的数量也越来越多。为了提高车辆的管理效率,缓解公路上的交通压力,我们必须找到一种解决方案。而作为汽车“身份证”的汽车车牌,是在公众场合能够唯一确定汽车身份的凭证。我们可以以此为依据,设计一种车牌识别系统监控各个车辆的情况。车牌识别的难点: 我国汽车牌照自身特征的复杂性1) 汉字、字母、数字混合。我国的车牌不单单有英文字母和阿拉伯数字,还有汉字。2) 颜色种类多。国外的车牌颜色种类相对于国内较少一些,我国的车牌颜色种类较多。3) 人为因素复杂。由于环境、道路或者人为因素造成车牌有严重污渍、车牌模糊不清或者车牌偏斜角度很大的车辆,在我国都可
3、以上路行驶。4) 车牌格式多。我国的车牌格式很多,包括:民用车牌、公安警察车牌、武警车牌、军车车牌、外交车牌、特种车牌、消防车牌等。 外部环境影响1) 外部光照条件各不相同,白天和晚上的光照各不相同。光照对采集的图像质量产生很大的影响。不同的光照角度对车牌光照的不均匀影响也很大。不同的气候条件、背景光照环境、车牌反光程度都决定了车牌的亮度特征。2) 外界背景的复杂程度也影响车牌的定位准确率。背景中和车牌区域当中有许多和车牌特征相似的长方形区域,这些容易给车牌定位造成误判导致车牌定位的准确率降低。2 主要理论概况本图像预处理模块是将图像灰度化和用Roberts算子进行边缘检测的步骤。车牌定位和分
4、割采用的是利用数学形态法来确定车牌位置,再利用车牌彩色信息的彩色分割法来完成车牌部位分割。字符的分割采用的方法是以二值化后的车牌部分进行垂直投影,然后在对垂直投影进行扫描,从而完成字符的分割。本文即是针对其核心部分进行阐述并使用MATLAB软件环境中进行字符分割的仿真。一个完整的车牌号识别系统要完成从图像采集到字符识别输出,过程相当复杂,基本可以分成硬件部分跟软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌位置提取、字符分割、字符识别四大部分。3 研究的主要内容3.1 车牌识别研究内容车牌定位的研究现状车牌定位决定其后的车牌字符分割和识别,因此车牌定位是车牌识别技术中最关
5、键的一步。车牌定位的目的是从包含整个车辆的图像中找到车牌区域的图像。车牌定位方法的出发点是利用车牌区域的特征来判断牌照,将车牌区域从整幅车辆图像中分割出来。车牌字符识别的研究现状车牌字符识别就是对分割出的待识别的字符进行识别处理。车牌的字符由有限的汉字、英文字母和数字组成。目前车牌字符识别最常用于车牌字符识别的方法是基于模板匹配的方法、基于特征分类的方法两大类。字符分割算法一直在不断的完善。针对车牌的字符分割,是字符分割的一个具体应用,目前根据车牌的字符特征提出的算法主要有:基于先验知识的分割算法、基于投影轮廓和拓扑结构的分割算法等。例如,黄可为等利用视觉神经生理学和认知学实验结果,归纳出一种
6、仿生目标搜索策略将其运行到车牌字符分割中。吴进军等根据车牌字符的排列规律和字符的几何特征,提出了一种基于第三个字符定位的车牌字符分割方法,很好地解决了车牌定位后的字符缺损情况。3.2 车牌识别系统程序设计3.2.1车牌区域提取图像读取及车牌区域提取主要有:图像灰度图转化、图像边缘检测、灰度图腐蚀、图像的平滑处理以及车牌区域的边界值计算。其程序流程图如下: 输入车牌图象灰度校正平滑处理提取边缘 图 3.1 预处理及边缘提取框图3.2.2图像灰度图转化由于车牌的底色不同,所以从RGB图像直接进行车牌区域提取存在很大困难,但不管哪种底色的车牌,其底色与上面的字符颜色的对比度大,将RGB图像转化成灰度
7、图像时,车牌底色跟字符的灰度值会相差很大。原图、灰度对于将彩色图象转换成灰度图象时,图象灰度值H可由下面的公式计算: (3.1) (3.2) 通过程序运行其效果图见图3.2和图3.3:图 3.2 原始图像图 3.3灰度图像经过程序运行出来的灰度图可以比较容易的识别出车牌的区域,达到了预期的灰度效果。3.2.3图像的边缘检测 在Matlab中利用函数edge()实现边缘检测,具体的用法如下所示:Car_Image_Bin=edge(Car_Image_Gray,robert,0.15,both);Robert 算子采用对角方向相邻两像素之差,其计算公式如下: (3.3) (3.4)其幅值为: Q
8、UOTE * MERGEFORMAT (3.5)使用边缘检测,腐蚀效果如图3.4所示:图 3.4 边缘效果图基本上达到了边缘检测的效果。但是,在车牌附近的其他区域也由于各种干扰的影响,也存在一些白色区域。所以要对图像做进一步的处理,用灰度图腐蚀来消除多余的边界点。3.2.4灰度图腐蚀所谓腐蚀即一种消除边界点,使边界向内部收缩的过程。利用它可以消除小而且无意义的物体。腐蚀的规则是输出图像的最小值是输入图像领域中的最小值,在一个二值图像中,只要有一个像素值为0,则相应的输出像素值为0。本系统使用imerode()函数,Car_Image_Erode=imerode(Car_Image_Bin,Se
9、);腐蚀后如图:图 3.5 腐蚀效果图已经得到了车牌图像的轮廓线了,只要再经过适当的处理即可把车牌提出出来。3.2.5图像平滑处理得到车牌区域的图像轮廓线后,由于图像的数字化误差和噪声直接影响了脚点的提取,因此在脚点提取之前必须对图像进行平滑处理,Matlab有一个图像平滑处理函数imclose()Car_Image_Perform=imclose(Car_Image_Erode,Se);结构单元中Se一个小于对象闭合图形,只要两个封闭域的距离小于Se,就将这两个连接成一个连通域,Se生成方式采用Se=strel(rectangle,25,25);由于车牌图像经过腐蚀以后只剩下车牌区域以及车的
10、标志。在程序运行的图像平滑后效果如下:图 3.6 平滑处理后效果 从平滑后的效果图分析,达到了预定的目标。消除了图像的数字化误差和噪声对脚点的直接提取的影响。3.2.6移除小对象图像平滑处理了,可能会有多个闭合区域,对于不是车牌区域的必须予以删除,Matlab提供了一个函数bwareaopen(),用于删除二值图像中面积小于一个定值的对象,默认情况下使用8邻域,Car_Image_Perform2=bwareaopen(Car_Image_Perform,2000);这样,Car_Image_Perform中面积小于2000的对象都被删除了。小对象被删除后的图像如图3.7所示:图 3.7 移除
11、小对象后效果图 移除小对象后的效果图已经非常明显了,图像中最后只存在车牌区域,其他的图像已经完全滤除掉了,包括小物体,车的标志等影响已经没有了。3.2.7车牌区域的边界值计算采用水平与垂直双向投影法。水平坐标的确定,先定义一个的数组,其中 QUOTE * MERGEFORMAT 为原始图像的宽度值,然后将二值图像垂直投影到轴。从直方图中基本可以看书水平方向上的两个分界线,为了便于处理,该课题将像素值临界值定量化,取值5个像素。从左向右寻找第一个1值像素大于5的 QUOTE * MERGEFORMAT 坐标为水平方向左侧分界线,从右向左寻找到第一个1值像素量大于5的为右侧分界线,程序可以用for
12、循环语句。垂直方向的分界线可用同样的方法实现。分界线计算后,即可从原图像中剪切出只包含车牌的区域图像。剪切得到的图像如下。图3.9为RGB图像切割出来的图像:图 3.9 原图中的车牌区域图像 对比原始图像与二值图裁减图可以看出,车牌的四个边界值基本上被确定下来了,这样就可以从原始图像中直接确定车牌的区域了。所以车牌就成功地被提取出来了3.2.8车牌处理先将RGB图像转换成灰度值,再将灰度图转化成二进制图,在Matlab实现方式如下:T=round(License_Image_Gray_max-(License_Image_Gray_max-License_Image_Gray_min)/3);
13、 同时采集大的图像噪点依然存在,因此可以通过处理图像的低频部分来锐化图像。这里采用高通滤波算法。腐蚀已经在在上文介绍,膨胀刚好与腐蚀相反,运算规则是输出图像的像素值是输入图像邻域中的最大值,在一个二值图像中,只要一个像素值为1,则相应的输出像素值为1。根据经验值,车牌图像中,字符面积与车牌面积之比在(0.235,0.365)之间,因此计算字符面积与车牌面积比值,如果大于0.365则对图像进行腐蚀,如果小于0.235则对图像进行膨胀,在这里结构元素Se使用一个二维单位矩阵 QUOTE * MERGEFORMAT 。图 3.12 车牌处理后效果4 结论 根据车牌特点,车牌定位的算法分为三类,一类是
14、基于边缘的,一类是基于颜色的,一类是基于 HYPERLINK /base/2 o undefined t /hqw7286/article/details/_blank 机器学习的等。这里我采用的是边缘检测的方法实现定的。字符分割的方法也有多种:1.基于聚类分析的字符分割;2.投影分割的方法;3.基于模板匹配的字符分割等。最常用的是投影分割,主要是针对在车牌定位,图像预处理后比较规则的车牌图像。优点是程序逻辑设计简单,循环执行功能单一,便于设计和操作,程序执行时间短。 字符识别的基本方法通常又三类:1.结构特征分析方法;2.模板匹配法;3.神经网络法。此处采用的是模板匹配的方法,即是将要识别的
15、字符与事先构造好的模板进行比对,根据与模板的相似度的大小来确定最终的识别结果。但是系统本身还存在许多不足,特别是对图像的分割与识别,目前还存在一定问题。距离具体实用的要求仍有很大差距,但我却在这次 学习中学到了很多知识!参考文献1张红,数字图像处理与分析2叶晨洲,廖金周,一种基于纹理的牌照图象二值化方法3刘阳,伊铁源等.数字图象处理应用于车辆牌照的识别4崔江、王友仁.车牌自动识别方法中的关键技术研究5韩勇强、李世祥.汽车牌照子图像的定位算附录:程序源码% function d=main()close allclc % 清空命令窗口的所有输入和输出,类似于清屏%自动弹出提示框读入图像filena
16、me,filepath=uigetfile(.jpg,输入一个需要识别的车牌图像);% 直接自动读入%file=strcat(filepath,filename); %strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名I=imread(file);figure(name,原图),imshow(I);title(原图)%图像增强% h=ones(5,5)/25; %过滤器h% I=imfilter(I,h);%真彩色增强% figure(name,真彩色增强);imshow(I);title(真彩色增强);I1=rgb2gray(I); % RGB图
17、像转灰度图像figure(name,灰度处理前),subplot(1,2,1),imshow(I1);title(灰度处理前的灰度图);subplot(1,2,2),imhist(I1);title(灰度处理前的灰度图直方图);%线性灰度变换I1=imadjust(I1,0.3,0.7,);figure(name,灰度处理后),subplot(1,2,1),imshow(I1);title(灰度处理后的灰度图);subplot(1,2,2),imhist(I1);title(灰度处理后的灰度图直方图);%进行中值滤波I1=medfilt2(I1);figure,imshow(I1);title
18、(中值滤波);%边缘检测:sobel,roberts,canny,prewitt等I2=edge(I1,roberts,0.25,both); %边缘检测算法,强度小于阈值0.15的边缘被省略掉,both两个方向检测(缺省默认)figure(name,边缘检测),imshow(I2);title(robert算子边缘检测)se=1;1;1;I3=imerode(I2,se);% 腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象figure(name,腐蚀后图像),imshow(I3);title(腐蚀后的图像);se=strel(rectangle,20,20);% 2
19、5X25的矩形 strel?I4=imclose(I3,se);% 用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用figure(name,平滑处理),imshow(I4);title(平滑图像的轮廓);I5=bwareaopen(I4,1000);% 从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符figure(name,移除小对象),imshow(I5);title(从对象中移除小对象);y,x,z=size(I5);% y是行数,x是列数,z是维数myI=double(I5);% 转成双精度型tic % 开始计时Blue_y=
20、zeros(y,1);% zeros(M,N) 表示的是M行*N列的全0矩阵for i=1:y for j=1:x if(myI(i,j,1)=1) % 判断蓝色像素 Blue_y(i,1)= Blue_y(i,1)+1;% 蓝色像素点统计 end end endtemp MaxY=max(Blue_y);% Y方向车牌区域确定 temp MaxY临时变量MaxYPY1=MaxY;% 以下为找车牌Y方向最小值while (Blue_y(PY1,1)=5)&(PY11)% 为什么判断蓝色像素点=5(才算蓝色)? PY1=PY1-1;end PY2=MaxY; % 以下为找车牌Y方向最大值 ?难道
21、最大值不是MaxY?while (Blue_y(PY2,1)=5)&(PY2y) PY2=PY2+1;end% IY=I(PY1:PY2,:,:);% X方向 %Blue_x=zeros(1,x);% 进一步确定x方向的车牌区域for j=1:x for i=PY1:PY2% 只需扫描的行 if(myI(i,j,1)=1) % 判断蓝色像素 Blue_x(1,j)= Blue_x(1,j)+1; % 蓝色像素点统计 end end endPX1=1;% 以下为找车牌X方向最小值while (Blue_x(1,PX1)3)&(PX1x)% 为什么判断蓝色像素点3(不算蓝色?)? PX1=PX1+
22、1;end PX2=x;% 以下为找车牌X方向最大值while (Blue_x(1,PX2)PX1) PX2=PX2-1;endPY1=PY1-2;% 对车牌区域的校正 为什么要这么+?PX1=PX1-2;PX2=PX2+3;PY2=PY2+10;dw=I(PY1:PY2-8,PX1:PX2,:);% 裁剪图像toc %t=toc; % 停止计时%figure(7),subplot(1,2,1),imshow(IY),title(行方向合理区域);figure(name,定位剪切后的彩色车牌图像),%subplot(1,2,2),imshow(dw),title(定位剪切后的彩色车牌图像)im
23、write(dw,dw.jpg);% 直接自动读入%filename,filepath=uigetfile(dw.jpg,输入一个定位裁剪后的车牌图像);%jpg=strcat(filepath,filename); % strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名a=imread(dw.jpg);b=rgb2gray(a);imwrite(b,1.车牌灰度图像.jpg);figure(name,车牌处理);subplot(3,2,1),imshow(b),title(1.车牌灰度图像)%g_max=double(max(max(b);% 以
24、下作阈值化(灰度图转二值图)%g_min=double(min(min(b);% max(a)求的每列的最大值,是一维数据;max(max(a) 是求这一维数据的最大值。%T=round(g_max-(g_max-g_min)/2); % T 为二值化的阈值round:取整为最近的整数%m,n=size(b);% m:b的行向量数 n:b的列向量数%d=(double(b)=T);% d:二值图像%imwrite(d,2.车牌二值图像.jpg);%线性灰度变换b=imadjust(b,0.3,0.7,);subplot(3,2,2),imshow(b);title(2.线性灰度处理后的灰度图)
25、;%进行二值化处理d=im2bw(b,0.4);%将灰度图像进行二值化处理imwrite(d,2.车牌二值图像.jpg);subplot(3,2,3),imshow(d),title(3.车牌二值图像);%显示二值化图像%进行中值滤波d=medfilt2(d);imwrite(d,4.均值滤波后.jpg);subplot(3,2,4),imshow(d);title(4.中值滤波后);% 均值滤波%h=fspecial(average,3);%d=im2bw(round(filter2(h,d);% 滤波后,im2bw():将图像转成二值图像 (可以不用round函数 也是一样的)%imwri
26、te(d,4.均值滤波后.jpg);%subplot(3,2,4),imshow(d),title(4.均值滤波后)% 某些图像进行操作% 膨胀或腐蚀?感觉没什么效果咧?% se=strel(square,3);% 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀% line/diamond/ball/square/dish. 线/菱形/球/正方形/圆se=eye(2); % eye(n) 返回n乘n单一矩阵; 单位矩阵m,n=size(d);if bwarea(d)/m/n=0.365 % 函数bwarea 计算目标物的面积,单位是像素;bwarea/m/n即为单个像素? d=imer
27、ode(d,se);% 腐蚀elseif bwarea(d)/m/n=0.235 d=imdilate(d,se);% 膨胀endimopen(d,se);%se=eye(7);%imopen(d,se);imwrite(d,5.膨胀或腐蚀处理后.jpg);subplot(3,2,5),imshow(d),title(5.膨胀或腐蚀处理后)% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(d);% 调用qiege()子程序m,n=size(d);figure,subplot(2,1,1),imshow(d),title(n)%k1=1;k2=1;j=1
28、;s=sum(d);%sum(x)就是竖向相加,求每列的和,结果是行向量;sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。sum(X(:)表示矩阵求和while j=n % 什么原理? while s(j)=0% 无文字?为什么? j=j+1; end k1=j; while s(j)=0 & j=round(n/6.5) val,num=min(sum(d(:,k1+5:k2-5); d(:,k1+num+5)=0;% 分割 endend% 再切割%d=qiege(d);% 切割出 7 个字符y1=10;y2=0.25;flag=0;word1=;while flag=0%
29、flag为自定义,以便标记循环用 m,n=size(d); %left=1; wide=0; while sum(d(:,wide+1)=0 % 二值图像:黑色像素代表感兴趣的对象而白色像素代表背景。逻辑矩阵只包括0(显示为黑色)和1(显示为白色) wide=wide+1;% ?wide的意义? end if widey2 %?什么意思? flag=1;word1=temp; %第一个字符 end d(:,1:wide)=0;d=qiege(d); %?为什么又处理一次? endend% 分割出第二个字符word2,d=getword(d);% 分割出第三个字符word3,d=getword(
30、d);% 分割出第四个字符word4,d=getword(d);% 分割出第五个字符word5,d=getword(d);% 分割出第六个字符word6,d=getword(d);% 分割出第七个字符word7,d=getword(d);subplot(5,7,1),imshow(word1),title(1);subplot(5,7,2),imshow(word2),title(2);subplot(5,7,3),imshow(word3),title(3);subplot(5,7,4),imshow(word4),title(4);subplot(5,7,5),imshow(word5),
31、title(5);subplot(5,7,6),imshow(word6),title(6);subplot(5,7,7),imshow(word7),title(7);m,n=size(word1);% 商用系统程序中归一化大小为 40*20,此处演示word1=imresize(word1,40 20);%imresize对图像做缩放处理,常用调用格式为:B=imresize(A,ntimes,method);其中method可选nearest,bilinear(双线性),bicubic,box,lanczors2,lanczors3等word2=imresize(word2,40 20)
32、;word3=imresize(word3,40 20);word4=imresize(word4,40 20);word5=imresize(word5,40 20);word6=imresize(word6,40 20);word7=imresize(word7,40 20);subplot(5,7,15),imshow(word1),title(11);subplot(5,7,16),imshow(word2),title(22);subplot(5,7,17),imshow(word3),title(33);subplot(5,7,18),imshow(word4),title(44)
33、;subplot(5,7,19),imshow(word5),title(55);subplot(5,7,20),imshow(word6),title(66);subplot(5,7,21),imshow(word7),title(77);imwrite(word1,1.jpg); % 创建七位车牌字符图像imwrite(word2,2.jpg);imwrite(word3,3.jpg);imwrite(word4,4.jpg);imwrite(word5,5.jpg);imwrite(word6,6.jpg);imwrite(word7,7.jpg);liccode=char(0:9 A:
34、Z 京辽桂陕苏渝浙);%建立自动识别字符代码表;京津沪渝港澳吉辽鲁豫冀鄂湘晋青皖苏赣浙闽粤琼台陕甘云川贵黑藏蒙桂新宁% 编号:0-9分别为 1-10;A-Z分别为 11-36;% 京津沪渝港澳吉辽鲁豫冀鄂湘晋青皖苏% 赣浙闽粤琼台陕甘云川贵黑藏蒙桂新宁% 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59% 60 61 62 63 64 65 66 67 68 69 70SubBw2=zeros(40,20); % 创建一个40行20列的0矩阵l=1;for I=1:7 ii=int2str(I); % 将整
35、型数据转换为字符串型数据 t=imread(ii,.jpg);% 依次读入七位车牌字符 SegBw2=imresize(t,40 20,nearest); % 对读入的字符进行缩放 if I=1 % 第一位汉字识别 kmin=37; kmax=43; elseif I=2 % 第二位 AZ 字母识别 kmin=11; kmax=36; else % 第三位以后是字母或数字识别 ;即I=3 kmin=1; kmax=36; end for k2=kmin:kmax fname=strcat(字符模板,liccode(k2),.jpg); % strcat函数:连接字符串 SamBw2 = imr
36、ead(fname); fori=1:40 for j=1:20 SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j); end end % 以上相当于两幅图相减得到第三幅图 进行匹配 Dmax=0; % 与模板不同的点个数 for k1=1:40 for l1=1:20 if( SubBw2(k1,l1) 10 | SubBw2(k1,l1) 2 15)20以上无区别 Dmax=Dmax+1; end end end Error(k2)=Dmax; % 记录下字符与模板k2不同的点个数 end Error1=Error(kmin:kmax); MinError=min(Er
37、ror1); % 差别最小的 findc=find(Error1=MinError); % 找出差别最小的模板 Code(l)=liccode(findc(1)+kmin-1); % 此处用2*l-1且后面的2*l= ,第隔一空格输出一个字符 Code(3)= ;Code(4)= ; l=l+1; ifl=3;% 后五位与前两位字符隔开 l=l+2; endendfigure(10),subplot(5,7,1:7),imshow(dw),title(第一步:车牌定位),xlabel(第二步:车牌分割); %,subplot(6,7,15),imshow(word1);subplot(6,7,
38、16),imshow(word2);subplot(6,7,17),imshow(word3);subplot(6,7,18),imshow(word4);subplot(6,7,19),imshow(word5);subplot(6,7,20),imshow(word6);subplot(6,7,21),imshow(word7);subplot(6,7,22:42),imshow(dw.jpg);%xlabel(第三步:识别结果为: , Code,Color,b);附录资料:不需要的可以自行删除 C语言图形模式速成第一节 图形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函
39、数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为
40、图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()
41、int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:void far detectgraph(int *gdriver, *gmode);其中gdriver和gmode的意义与上面相同。
42、自动进行硬件测试后进行图形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自动测试硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*输出测试结果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*
43、/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph
44、();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color);设置作图色: void far setcolor(int color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见graphics.h。清除图形屏幕内容但不清除图形背景
45、使用清屏函数,其调用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*图形初始化*/setbkcolor(0); /*设置图形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*/circle(320, 240, 20+i*10); /*画半径不同的圆*/ge
46、tch();for(i=0; i=15; i+)setbkcolor(i); /*设置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。int far getcolor(void); 返回现行作图颜色值。int far getmaxcolor(void); 返回最高
47、可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640 x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到
48、右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数 int far getmaxx(void);返回x轴的最大值。int far getmaxy(void);返回y轴的最大值。int far getx(void); 返回游标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void far moveto(int x, int y); 移动游标到(x, y)点,不是
49、画点,在移动过程中亦画点。void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。、画线I. 画线函数TURBO C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。void far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。void far linerel(int dx, int dy); 画一条从现行游标(x,y)到按相对增量确定的点
50、(x+dx, y+dy)的直线。void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定,不再重述)。 void ellipse(int x, int y
51、, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数
52、为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画箭头的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,3
53、00,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*设置作图颜色*/drawpoly(8, arw); /*画一箭头*/getch();closegraph();return 0;II、设定线型函数在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍
54、有关线型的设置函数。void far setlinestyle(int linestyle,unsigned upattern,int thickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见graphics.h。对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(struct linesettingstypefar *linein
55、fo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画
56、线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。有关线型设定和画线函数的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setline
57、style(0, 0, 3); /*设置三点宽实线*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*设置一点宽用户定义线*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();return 0;第四节 基本图形的填充填充就是用规定的颜色和图模填满一个封闭图形。 一般是先画轮廓再填充。TURBO C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改
58、变填充方式时,TURBO C 以默认方式填充。 void far bar(int x1, int y1, int x2, int y2);确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。说明:此函数不画出边框,所以填充色为边框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int topflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度
59、的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和
60、y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。第五节 设定填充方式TURBO C有四个与填充方式有关的函数。下面分别介绍: void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数见graphics.h。除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年全国企业员工全面质量管理知识竞赛自评答题含答案
- 2025年一级计算机基础及WPSOffice应用计算机等级考试试题及解答及答案
- 2026年时事政治题库附答案
- 2026年安全员技师习题及答案
- 2026年暖通造价员考试题库附答案
- 2026年《有限空间作业安全许可标准考试卷》附答案
- 2026年四川省绵竹市高二化学下册期末考试模拟测试卷附答案【黄金题型】
- 2026年四川省华蓥市高二化学下册期末考试模拟考试卷【轻巧夺冠】附答案
- 工业厂房结构吊装施工方案范例
- 2026年黑龙江省富锦市高二化学下册期末考试模拟检测卷附参考答案【培优A卷】
- 混凝土拌和站生产控制方案
- 建材公司内部管理制度
- 便利店消防安全责任制度
- 重症医学硕士26届考研复试高频面试题包含详细解答
- 2026年四川宜宾市中考英语试卷含答案
- 2025年吉林大学强基校测笔试真题及答案
- 一年级下册道德与法治教学工作总结
- 餐饮店员工培训课件模板
- 加拿大临床实践指南解读:糖尿病与慢性肾脏疾病管理课件
- (2025)ACC专家共识声明:心源性休克的评估与管理核心要点解读26课件
- 纵隔气肿课件
评论
0/150
提交评论