SRC-RSC遮擋人臉識別實驗報告_第1頁
SRC-RSC遮擋人臉識別實驗報告_第2頁
SRC-RSC遮擋人臉識別實驗報告_第3頁
SRC-RSC遮擋人臉識別實驗報告_第4頁
SRC-RSC遮擋人臉識別實驗報告_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、模式識別課程報告基于SRC_RSC算法的遮擋人臉圖像識別的實驗研究學 年:_201x學年第x學期_姓 名:_xxxx_學 號:_xxxxxxxxxx_專 業(yè):_xxxxxxxxxx_ _指導教師:_ xxxxx_提交日期: _201x年x月xx日 _1.算法簡介1.1 SRC算法簡介基于基于稀疏表達的分類算法(Sparse Recognition based Classification , 簡稱SRC算法),是人臉識別領域最經(jīng)典的算法之一,最初是由John Wright, Allen Y. Yang等人在2008年的Robust Face Recognition via Sparse Rep

2、resentation一文中將SRC算法應用到人臉識別領域,使用該算法可以大大增強人臉的識別率,包括對含有噪聲的人臉圖像、有遮擋物的人臉圖像、進行偽裝的人臉圖像、不同曝光的人臉圖像、不同面目表情的人臉圖像等多個場景下通過SRC算法對特定的人臉圖像進行識別。人臉的稀疏表示是基于光照模型。即一張人臉圖像,可以用 HYPERLINK /base/14 o MySQL知識庫 t /xiaoshengforever/article/details/_blank 數(shù)據(jù)庫中同一個人所有的人臉圖像的線性組合表示。而對于數(shù)據(jù)庫中其它人的臉,其線性組合的系數(shù)理論上為零。由于數(shù)據(jù)庫中一般有很多個不同的人臉的多張圖像

3、,如果把數(shù)據(jù)庫中所有的圖像的線性組合來表示這張給定的測試人臉,其系數(shù)向量是稀疏的。因為除了這張和同一個人的人臉的圖像組合系數(shù)不為零外,其它的系數(shù)都為零。以上所述即為SRC識別人臉圖像的原理。不過在該模型下導出了基于稀疏表示的另外一個很強的假設條件,即所有的人臉圖像必須是事先嚴格對齊的,否則,稀疏性很難滿足。換言之,對于表情變化,姿態(tài)角度變化的人臉都不滿足稀疏性這個假設。所以,經(jīng)典的稀疏臉方法很難用于真實的應用場景。稀疏臉很強的地方在于對噪聲相當魯棒,相關文獻表明,即使人臉圖像被80%的隨機噪聲干擾,仍然能夠得到很高的識別率。稀疏臉另外一個很強的地方在于對于部分遮擋的情況,例如戴圍巾,戴眼鏡等,

4、仍然能夠保持較高的識別性能。上述兩點,是其它任何傳統(tǒng)的人臉識別方法所不具有的。1.2 RSC算法簡介魯棒的稀疏編碼算法(Robust Sparse Coding , 簡稱RSC算法),是通過求解Lasso問題,進而求解稀疏編碼問題,是SRC的改進算法之一,具有極強的應用性,最初是由Meng Yang, Lei Zhang等人在2011年的Robust Sparse Coding for Face Recognition一文中將RSC算法應用到人臉識別領域。該文作者沒有直接求解稀疏編碼問題,而是求解Lasso問題,因為Lasso問題的解和稀疏編碼的解是等價的。在傳統(tǒng)的SRC框架下,編碼誤差使用L

5、2范數(shù)來度量的,這也就意味著編碼誤差滿足高斯分布,然而,當人臉圖像出現(xiàn)遮擋和噪聲污染的情況下,并非如此。在字典學習框架下,這樣的字典是有噪聲的。該文作者對原始Lasso問題進行改進,求解加權(quán)L1范數(shù)約束的線性回歸問題。 人臉識別的魯棒稀疏編碼的稀疏表示識別方法將稀疏表示的保真度表示為余項的L2范數(shù),但最大似然估計理論證明這樣的假設要求余項服從高斯分布,實際中這樣的分布可能并不成立,特別是當測試圖像中存在噪聲、遮擋和偽裝等異常像素,這就導致傳統(tǒng)的保真度表達式所構(gòu)造的稀疏表示模型對上述這些情況缺少足夠的魯棒性。而最大似然稀疏表示識別模型則基于最大似然估計理論,將保真度表達式改寫為余項的最大似然分布

6、函數(shù),并將最大似然問題轉(zhuǎn)化為一個加權(quán)優(yōu)化問題,在稀疏表示的同時引入代表各像素不同權(quán)值的矩陣,使得該算法對于圖像中包含異常像素的情況表現(xiàn)出很好的魯棒性。 此算法的關鍵還在于權(quán)重系數(shù)的確定,文中采用的是logistic函數(shù),而具體的實現(xiàn)則是通過迭代估計學習得到。該方法基于這樣一個事實:被遮擋或噪聲干擾的像素點賦予較小的權(quán)重,而其它像素點的權(quán)重相對較大。具體迭代算法采用經(jīng)典的迭代重加權(quán)算法框架,當然內(nèi)部嵌入的稀疏編碼的求解過程。此算法在50%遮擋面積的情況下取得的更好更滿意的結(jié)果。但是文中沒有比較計算時間上的優(yōu)略而直說和SRC框架差不多。2.算法步驟2.1 SRC算法步驟具體的SRC算法步驟如Spa

7、re Representation-based Classification(SRC)所示2.2 RSC算法步驟稀疏編碼模型等同于求解LASSO問題,LASSO問題模型如公式1所示(1) 0,是一個常數(shù),表示被編碼的信號,表示含有m個dj 列向量的字典集, 是編碼系數(shù)向量,在我們?nèi)四樧R別問題中,dj 表示訓練人臉樣本,字典集D表示訓練集。加權(quán)Lasso問題的目標函數(shù)描述如公式2所示(2)具體的RSC的算法步驟可以用LRSC(Iteratively Reweighted Sparse Coding)算法步驟表示如下3.MATLAB程序3.1 SRC算法MATLAB代碼表示function pre

8、_label=SRC(train_sample,train_label,test_sample,ClassNum)I=eye(size(train_sample,1);et_train=train_sample I;test_tol=size(test_sample,2);train_tol=length(train_label);pre_label=zeros(1,test_tol);for i=1:test_tol y=test_sample(:,i); xp = l1_ls(et_train,y,1e-3,quiet,true); train_x=xp(1:train_tol,:); e

9、rr=xp(train_tol+1:end,:); test_clean=y-err; %構(gòu)造sparse矩陣,大小為train_tol*ClassNum,最多有l(wèi)ength(train_x)個非零值 W=sparse(,train_tol,ClassNum,length(train_x); %得到每類對應的系數(shù) for j=1:ClassNum ind=(j=train_label); W(ind,j)=train_x(ind); end %計算測試樣本和每類重構(gòu)樣本之間的殘差 temp=train_sample*W-repmat(test_clean,1,ClassNum); residu

10、al=sqrt(sum(temp.2); %把測試樣本分在最小殘差對應的類別中 ,index=min(residual); pre_label(i)=index;End3.2 RSC算法MATLAB代碼表示function id = RSC (D,D_labels,y,mean_x,ll) classnum = 100;%類別數(shù)目%nIter = 10;%進行10次迭代運算% % disc_set,disc_value,Mean_Image=Eigenface_f(D,260);% disc_value = sqrt(disc_value);% mean_x = Mean_Image+0.00

11、1*disc_set*disc_value;% mean_x = mean(D,2);lambda = 100;sigma = 0.5;iter = 120; beta = 0.1; residual = (y-mean_x).2;%計算剩余%w = 1./(1+1./exp(-beta*(residual-iter);w_y_o = w.*y;norm_w_y_o = norm(w_y_o,2); % ll = size(D,2); %迭代運算%for nit = 1: nIter fprintf(.); ww = w./max(w); index_w = find(ww=1e-3); WW

12、_index = repmat(w(index_w),1 ll); W_D = WW_index.*D(index_w,:); W_y = w(index_w).*y(index_w); ratio = norm(W_y,2)/norm_w_y_o; temp_s = l1_ls(W_D,W_y,lambda*ratio,sigma*ratio,true); residual = (y-D*temp_s).2; w = 1./(1+1./exp(-beta*(residual-iter); end %分類標記%for class = 1:classnum s = temp_s (D_label

13、s = class); z1 = w.*(y - D(:,D_labels = class)*s); gap1(class) = z1(:)*z1(:);end index = find(gap1=min(gap1);id = index(1);4.實驗4.1通過SRC和RSC進行同一維度下同一人臉面部不同遮擋面積下的人臉識別的實驗在圖1 同一維度下人臉面部不同遮擋面積下的人臉識別組圖中(a)為Extended Yale B數(shù)據(jù)庫下的同一張面部在不同遮擋狀態(tài)下的測試原圖,經(jīng)過誤差處理后得到誤差處理的圖像(b),誤差圖像(b)反映了人臉被遮擋的物體的部分,之后經(jīng)過稀疏表示得到(c),之后分別經(jīng)過

14、SRC和RSC算法還原出原圖像(d)。圖1 同一維度下同一人臉面部不同遮擋面積下的人臉識別組圖SRC和RSC算法對同一維度下同一人臉面部不同遮擋面積下的人臉識別率比較如下表1和圖2、圖3所示。遮擋面積0%10%20%30%40%50%SRC110.9980.9850.9030.653RSC1110.9980.9690.839表1 SRC和RSC算法對同一維度下同一人臉面部不同遮擋面積下的人臉識別率比較圖2 SRC和RSC算法對同一維度下同一人臉面部不同遮擋面積下的人臉識別率比較柱狀圖圖3 SRC和RSC算法對同一維度下同一人臉面部不同遮擋面積下的人臉識別率比較折線圖經(jīng)實驗對比發(fā)現(xiàn),SRC和RS

15、C算法在同一維度下對被遮擋的同一人臉圖像都有較好的識別,在遮擋面積0%10%下,SRC與RSC算法的人臉識別率均為100%;在人臉遮擋面積20%的時候,SRC為99.8%,識別率已經(jīng)不是100%,但RSC仍然為100%;RSC算法是直到人臉遮擋面積超過30%后識別率才有所下降,不過與SRC人臉遮擋面積20%下的識別率相等。在由此可見RSC算法的對于遮擋下的人臉識別具有更好的識別效果,通過RSC魯棒性稀疏編碼算法對SRC算法的改進在遮擋人臉識別上是成功的。4.2通過SRC和RSC進行不同維度下人臉面部同一遮擋下的人臉識別的實驗使用Extended Yale B人臉數(shù)據(jù)庫進行不同維度下人臉面部同一

16、遮擋下的人臉識別的實驗,Extended Yale B 數(shù)據(jù)庫中包含啦2414張人臉正面圖,這些人臉圖片分為38組,每張圖片都是54*48的人臉圖片。在實驗過程中,我們將整個數(shù)據(jù)庫的人臉圖片隨機分為兩部分,一部分作為作為字典圖集,一部分作為測試圖集。然后通過SRC和RSC進行不同維度下人臉面部同一遮擋下的人臉識別的實驗。SRC和RSC算法對不同維度下人臉面部同一遮擋下的人臉識別率比較如下表2和圖4、圖5所示。維度3084150300SRC90.9%95.5%96.8%98.3%RSC91.3%98.1%98.4%99.4%表2 SRC和RSC算法對不同維度下人臉面部同一遮擋下的人臉識別率比較圖

17、4 SRC和RSC算法對不同維度下人臉面部同一遮擋下的人臉識別率比較柱狀圖圖5 SRC和RSC算法對不同維度下人臉面部同一遮擋下的人臉識別率比較折線圖經(jīng)實驗對比發(fā)現(xiàn),SRC和RSC算法不同維度下人臉面部同一遮擋下的的人臉圖像都有較好的識別,伴隨著維度的提升30維度300維度,SRC和RSC對遮擋的人臉識別率都呈現(xiàn)了較好的上升效果,并且RSC算法人臉識別率上升速度要快于SRC算法的人臉識別率上升速度;在300維度以上,RSC算法的識別率已經(jīng)超過了99%,而SRC算法的識別率未達到99%,從也可以看出RSC算法在遮擋人臉識別方面有著優(yōu)于SRC算法的識別效果,進一步證明了通過RSC魯棒性稀疏編碼算法

18、對SRC算法的改進在遮擋人臉識別上是成功的。5.結(jié)論在本實驗中,我們分別通過SRC與RSC算法對遮擋人臉圖像分別做了通過SRC和RSC進行同一維度下同一人臉面部不同遮擋面積下的人臉識別的實驗和通過SRC和RSC進行不同維度下人臉面部同一遮擋下的人臉識別的實驗,最終實驗結(jié)果均表明啦SRC和RSC對遮擋人臉識別都具有較好的識別效果,而RSC作為SRC的改進算法之一,凸顯了自身的優(yōu)勢,大大提高了遮擋人臉圖像的識別率。參考文獻1Wright J, Yang A Y, Ganesh A, et al. Robust face recognition via sparse representationJ.

19、 Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2009, 31(2): 210-227.1Meng Yang, Lei Zhang, Jian Yang, D. Zhang, Robust sparse coding for face recognition,CVPR, 2011, 2013 IEEE Conference on Computer Vision and Pattern Recognition, 2013 IEEE Conference on Computer Vision and Patter

20、n Recognition 2011, pp. 625-632, doi:10.1109/CVPR.2011.5995393附錄資料:不需要的可以自行刪除 C語言圖形模式速成第一節(jié) 圖形模式的初始化Turbo C 提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics. h 中,本節(jié)主要介紹圖形模式的初始化、獨立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時要確保有顯示器圖形驅(qū)動程序*.BGI,同時將集成開發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖

21、形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設置成為某種圖形模式,在未設置圖形模式之前,微機系統(tǒng)默認屏幕為文本模式(80列,25行字符模式),此時所有圖形函數(shù)均不能工作。設置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initgraph(int far *gdriver, int far *gmode,char *path);其中g(shù)driver和gmode分別表示圖形驅(qū)動器和模式,path是指圖形驅(qū)動程序所在的目錄路徑。有關圖形驅(qū)動器、圖形模式的符號常數(shù)及對應的分辨率見graphics. h。圖形驅(qū)動程序由Tu

22、rbo C出版商提供,文件擴展名為.BGI。 根據(jù)不同的圖形適配器有不同的圖形驅(qū)動程序。例如對于EGA、 VGA 圖形適配器就調(diào)用驅(qū)動程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;有時編程者并不知道所用的圖形顯示器適配

23、器種類,或者需要將編寫的程序用于不同圖形驅(qū)動器,Turbo C 提供了一個自動檢測顯示器硬件的函數(shù),其調(diào)用格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動進行硬件測試后進行圖形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自動測試硬件*/printf(the graphics driver is %d, mode is %dn,gdriver

24、,gmode); /*輸出測試結(jié)果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根據(jù)測試結(jié)果初始化圖形*/bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;上例程序中先對圖形顯示器自動檢測,然后再用圖形初始化函數(shù)進行初始化設置,但Turbo C提供了一種更簡單的方法, 即用gdriver=DETECT 語句后再跟initgraph()函數(shù)就行了。采用這種方法后,上例可改為:#include stdio.h#include graphics.

25、hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出圖形狀態(tài)的函數(shù)closegraph(),其調(diào)用格式為:void far closegraph(void);第二節(jié) 屏幕顏色的設置和清屏函數(shù)對于圖形模式的屏幕顏色設置,同樣分為背景色的設置和前景色的設置。在Turbo C中分別用下面兩個函數(shù): 設置背景色: void far setbkcolor

26、(int color);設置作圖色: void far setcolor(int color);其中color 為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關顏色的符號常數(shù)及數(shù)值見graphics.h。清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*圖形初

27、始化*/setbkcolor(0); /*設置圖形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*設置不同作圖色*/circle(320, 240, 20+i*10); /*畫半徑不同的圓*/getch();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;另外,TURB

28、O C也提供了幾個獲得現(xiàn)行顏色設置情況的函數(shù)。 int far getbkcolor(void); 返回現(xiàn)行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫圖函數(shù)基本圖形函數(shù)包括畫點,線以及其它一些基本圖形的函數(shù)。本節(jié)對這些函數(shù)作一全面的介紹。 、畫點. 畫點函數(shù) void far putpixel(int x, int y, int color); 該函數(shù)表示有指定的象元畫一個按color 所確定顏色的點。對于顏色color的值可從表3中獲得而對x, y是指圖形象元的坐標

29、。在圖形模式下,是按象元來定義坐標的。對VGA適配器,它的最高分辨率為640 x480,其中640為整個屏幕從左到右所有象元的個數(shù),480為整個屏幕從上到下所有象元的個數(shù)。屏幕的左上角坐標為(0,0),右下角坐標為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖形函數(shù)都是相對于圖形屏幕坐標,即象元來說的。關于點的另外一個函數(shù)是: int far getpixel(int x, int y); 它獲得當前點(x, y)的顏色值。 II、有關坐標位置的函數(shù) int far getmaxx(void);返回x軸的最大值。int far getmaxy

30、(void);返回y軸的最大值。int far getx(void); 返回游標在x軸的位置。void far gety(void); 返回游標有y軸的位置。void far moveto(int x, int y); 移動游標到(x, y)點,不是畫點,在移動過程中亦畫點。void far moverel(int dx, int dy); 移動游標從現(xiàn)行位置(x, y)移動到(x+dx, y+dy)的位置,移動過程中不畫點。、畫線I. 畫線函數(shù)TURBO C提供了一系列畫線函數(shù): void far line(int x0, int y0, int x1, int y1); 畫一條從點(x0,

31、 y0)到(x1, y1)的直線。void far lineto(int x, int y); 畫一作從現(xiàn)行游標到點(x, y)的直線。void far linerel(int dx, int dy); 畫一條從現(xiàn)行游標(x,y)到按相對增量確定的點(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為半徑,從sta

32、ngle開始到endangle結(jié)束(用度表示)畫一段圓弧線。在TURBO C中規(guī)定x軸正向為0 度,逆時針方向旋轉(zhuǎn)一周, 依次為90,180, 270和360度(其它有關函數(shù)也按此規(guī)定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)為中心,xradius,yradius為x軸和y軸半徑,從角stangle 開始到endangle結(jié)束畫一段橢圓線,當stangle=0,endangle=360時, 畫出一個完整的橢圓。void far rectangle(in

33、t x1, int y1, int x2, inty2); 以(x1, y1)為左上角,(x2, y2)為右下角畫一個矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫一個頂點數(shù)為numpoints,各頂點坐標由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2 倍頂點數(shù)個無素。每一個頂點的坐標都定義為x,y,并且x在前。值得注意的是當畫一個封閉的多邊形時,numpoints 的值取實際多邊形的頂點數(shù)加一,并且數(shù)組polypoints中第一個和最后一個點的坐標相同。下面舉一個用drawpoly()函

34、數(shù)畫箭頭的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*設置作圖顏色*/drawpoly(8, arw); /*畫一箭頭*/getch();closegraph

35、();return 0;II、設定線型函數(shù)在沒有對線的特性進行設定之前,TURBO C 用其默認值,即一點寬的實線,但TURBO C 也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點寬和三點寬。而線的形狀則有五種。下面介紹有關線型的設置函數(shù)。void far setlinestyle(int linestyle,unsigned upattern,int thickness);該函數(shù)用來設置線的有關信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。對于upattern,只有l(wèi)inestyle選USERBIT_LINE 時才有意義 (選其它線型,up

36、pattern取0即可)。此時uppattern的16位二進制數(shù)的每一位代表一個象元,如果那位為1,則該象元打開,否則該象元關閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數(shù)將有關線的信息存放到由lineinfo 指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面兩句程序可以讀出當前線的特性 struct linesettingstype *info

37、;getlinesettings(info);void far setwritemode(int mode);該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時將所畫位置的原來信息覆蓋了(這是TURBO C的默認方式)。如果mode=1, 則表示畫線時用現(xiàn)在特性的線與所畫之處原有的線進行異或(XOR)操作,實際上畫出的線是原有線與現(xiàn)在規(guī)定的線進行異或后的結(jié)果。因此,當線的特性不變,進行兩次畫線操作相當于沒有畫線。有關線型設定和畫線函數(shù)的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriv

38、er=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(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

39、);getch();closegraph();return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色和圖模填滿一個封閉圖形。 一般是先畫輪廓再填充。TURBO C提供了一些先畫出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個封閉圖形的函數(shù)。在沒有改變填充方式時,TURBO C 以默認方式填充。 void far bar(int x1, int y1, int x2, int y2);確定一個以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說明:此函數(shù)不畫出邊框,所以填充色為邊框。void far bar3d(int x1, int y1, int x2,

40、int y2,int depth,int topflag);當topflag為非0時, 畫出一個三維的長方體。當topflag為0時,三維圖形不封頂,實際上很少這樣使用。說明: bar3d()函數(shù)中,長方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);畫一個以(x, y)為圓心,radius為半徑,stangle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當stangle=0,endangle=360 時變成一個實心圓,并在圓內(nèi)從圓點

41、沿X軸正向畫一條半徑。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);畫一個以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設定填充方式TURBO C有四個與填充方式有關的函數(shù)。下面分別介紹: void far setfillstyle(int pattern, int color); color的值是當前屏幕圖形模式時顏色的有效值。pattern的值及與其等價的符號常數(shù)見

42、graphics.h。除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle() 函數(shù)設置。當選用USER_FILL時,該函數(shù)對填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因為在獲得有關填充信息時用到此項。void far setfillpattern(char * upattern,int color); 設置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個指向8個字節(jié)的指針。這8個字節(jié)定義了8x8點陣的圖形。每個字節(jié)的8位二進制數(shù)表示水平8點,8個字節(jié)表示8行,然后以此為模型向個封閉區(qū)域填充。void far get

43、fillpattern(char * upattern); 該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype結(jié)構(gòu)定義如下:struct fillsettingstypeint pattern; /* 現(xiàn)行填充模式 * /int color; /* 現(xiàn)行填充模式 * /; 有關圖形填充圖模的顏色的選擇,請看下面例程。#include stdio.h#inclu

44、de graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用戶定義圖模*/int gdriver,gmode,i;struct fillsettingstype save;/*定義一個用來存儲填充信息的結(jié)構(gòu)變量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 設置填充類型 */bar(100,150,200,50);

45、 /*畫矩形并填充*/bar3d(300,100,500,200,70,1); /* 畫長方體并填充*/pieslice(200, 300, 90, 180, 90);/*畫扇形并填充*/sector(500,300,180,270,200,100);/*畫橢圓扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90);sector(500,300,0,360,100,50

46、);getch();getfillsettings(&save);/*獲得用戶定義的填充模式信息*/closegraph();clrscr();printf(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*輸出目前填充圖模和顏色值*/getch();第六節(jié) 任意封閉圖形的填充截止目前為止,我們只能對一些特定形狀的封閉圖形進行填充,但還不能對任意封閉圖形進行填充。為此,TURBO C 提供了一個可對任意封閉圖形填充的函數(shù),其調(diào)用格式如下: void far floodfill(int x, int

47、 y, int border); 其中:x, y為封閉圖形內(nèi)的任意一點,border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個封閉圖形。注意:a. 如果x或y取在邊界上,則不進行填充。b. 如果不是封閉圖形則填充會從沒有封閉的地方溢出去,填滿其它地方。c. 如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。d. 由border指定的顏色值必須與圖形輪廓的顏色值相同, 但填充色可選任意顏色。下例是有關floodfill()函數(shù)的用法,該程序填充了bar3d()所畫長方體中其它兩個未填充的面。#include stdio.

48、h#include graphics.hmain()int gdriver, gmode;struct fillsettingstype save;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14); /*設置填充方式*/bar3d(100,200,400,350,200,1); /*畫長方體并填充*/floodfill(450,300,LIGHTRED);/*

49、填充長方體另外兩個面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*畫一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七節(jié)屏幕操作函數(shù)除了清屏函數(shù)以外,關于屏幕操作還有以下函數(shù): void far setactivepage(int pagenum); void far setvisualpage(int pagenum);這兩個函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁

50、。所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁面,該頁面并不一定可見。setvisualpage()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(Turbo C默認頁)。如果先用setactivepage() 函數(shù)在不同頁面上畫出一幅幅圖像,再用setvisualpage() 函數(shù)交替顯示,就可以實現(xiàn)一些動畫的效果。void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf); void far putimge(int x,int,y,void * mapbuf, int op); unsined

51、 far imagesize(int xl,int yl,int x2,int y2);這三個函數(shù)用于將屏幕上的圖像復制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize() 測試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部內(nèi)容需多少個字節(jié),然后再給mapbuf分配一個所測數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時可用putimage()函數(shù)將該圖像輸出到左上角為點(x, y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。 關于這個參數(shù)的定義參見下表。對于imag

52、esize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會出錯,出錯時返回-1。本節(jié)介紹的函數(shù)在圖像動畫處理、菜單設計技巧中非常有用。下面程序模擬兩個小球動態(tài)碰撞過程。#include stdio.h#include graphics.h#include malloc.hint main()int i, gdriver, gmode, size;void *buf;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlin

53、estyle(0,0,1);setfillstyle(1, 10);circle(100, 200, 30);floodfill(100, 200, 12);size=imagesize(69, 169, 131, 231);buf=malloc(size);if(!buf) return -1;getimage(69, 169, 131, 231,buf);putimage(500, 269, buf, COPY_PUT);for(i=0; i185; i+)putimage(70+i, 170, buf, COPY_PUT);putimage(500-i, 170, buf, COPY_P

54、UT);for(i=0;i185; i+)putimage(255-i, 170, buf, COPY_PUT);putimage(315+i, 170, buf, COPY_PUT);getch();closegraph();第八節(jié)用戶對文本字符大小的設置前面介紹的settextstyle()函數(shù),可以設定圖形方式下輸出文本字符這字體和大小但對于筆劃型字體(除8*8點陣字以個的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。 為此Turbo C2.0又提供了另外一個setusercharsize() 函數(shù),對筆劃字體可以分別設置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為: void fa

55、r setusercharsize(int mulx, intdivx, int muly, int divy); 該函數(shù)用來設置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。 調(diào)用函數(shù)setusercharsize()后,每個顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。 #include stdio.h#include graphics.hint main()int gdriver, gmode;

56、gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setfillstyle(1, 2); /*設置填充方式*/setcolor(WHITE); /*設置白色作圖*/rectangle(100, 100, 330, 380);floodfill(50, 50, 14); /*填充方框以外的區(qū)域*/setcolor(12); /*作圖色為淡紅*/settextstyle(1, 0, 8); /*三重筆劃字體,放大8倍*/outtextxy(120, 120, Very Good

57、);setusercharsize(2, 1, 4, 1);/*水平放大2倍,垂直放大4倍*/setcolor(15);settextstyle(3, 0, 5);/*無襯字筆劃,放大5倍*/outtextxy(220, 220, Very Good);setusercharsize(4, 1, 1, 1);settextstyle(3, 0, 0);outtextxy(180, 320, Good);getch();closegraph();return 0;第九節(jié)文本字體、字型和輸出方式的設置有關圖形方式下的文本輸出函數(shù),可以通過setcolor()函數(shù)設置輸出文本的顏色。另外,也可以改變

58、文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。 void far settexjustify(int horiz, int vert); 該函數(shù)用于定位輸出字符串。對使用outtextxy(int x, int y, char far *str textstring)函數(shù)所輸出的字符串,其中哪個點對應于定位坐標(x,y)在TurboC2.0中是有規(guī)定的。如果把一個字符串看成一個長方形的圖形,在水平方向顯示時,字符串長方形按垂直方向可分為頂部,中部和底部三個位置,水平方向可分為左,中,右三個位置,兩者結(jié)合就有9個位置。settextjustify()函數(shù)的第一個參數(shù)horiz 指出水平方向

59、三個位置中的一個,第二個參數(shù)vert指出垂直方向三個位置中的一個,二者就確定了其中一個位置。當規(guī)定了這個位置后,用outtextxy() 函數(shù)輸出字符串時, 字符串長方形的這個規(guī)定位置就對準函數(shù)中的(x,y)位置。而對用uttext()函數(shù)輸出字符串時,這個規(guī)定的位置就位于現(xiàn)行游標的位置。 有關參數(shù)horiz和vert的取值參見graphics.h。void far settextstyle(int font, int direction,int charsize); 該函數(shù)用來設置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性

60、。 Turbo C2.0對函數(shù)中各個參數(shù)的規(guī)定見graphics.h。有關圖形屏幕下文本輸出和字體字型設置函數(shù)的用法請看下例: #include stdio.h#include graphics.hint main()int i, gdriver, gmode;char s30;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setviewport(100, 100, 540, 380, 1);/*定義一個圖形窗口*/setfillstyle(1, 2); /*綠色以實填

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論