




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、模式識別課程報(bào)告基于SRC_RSC算法的遮擋人臉圖像識別的實(shí)驗(yàn)研究學(xué) 年:_201x學(xué)年第x學(xué)期_姓 名:_xxxx_學(xué) 號:_xxxxxxxxxx_專 業(yè):_xxxxxxxxxx_ _指導(dǎo)教師:_ xxxxx_提交日期: _201x年x月xx日 _1.算法簡介1.1 SRC算法簡介基于基于稀疏表達(dá)的分類算法(Sparse Recognition based Classification , 簡稱SRC算法),是人臉識別領(lǐng)域最經(jīng)典的算法之一,最初是由John Wright, Allen Y. Yang等人在2008年的Robust Face Recognition via Sparse Rep
2、resentation一文中將SRC算法應(yīng)用到人臉識別領(lǐng)域,使用該算法可以大大增強(qiáng)人臉的識別率,包括對含有噪聲的人臉圖像、有遮擋物的人臉圖像、進(jìn)行偽裝的人臉圖像、不同曝光的人臉圖像、不同面目表情的人臉圖像等多個(gè)場景下通過SRC算法對特定的人臉圖像進(jìn)行識別。人臉的稀疏表示是基于光照模型。即一張人臉圖像,可以用 HYPERLINK /base/14 o MySQL知識庫 t /xiaoshengforever/article/details/_blank 數(shù)據(jù)庫中同一個(gè)人所有的人臉圖像的線性組合表示。而對于數(shù)據(jù)庫中其它人的臉,其線性組合的系數(shù)理論上為零。由于數(shù)據(jù)庫中一般有很多個(gè)不同的人臉的多張圖像
3、,如果把數(shù)據(jù)庫中所有的圖像的線性組合來表示這張給定的測試人臉,其系數(shù)向量是稀疏的。因?yàn)槌诉@張和同一個(gè)人的人臉的圖像組合系數(shù)不為零外,其它的系數(shù)都為零。以上所述即為SRC識別人臉圖像的原理。不過在該模型下導(dǎo)出了基于稀疏表示的另外一個(gè)很強(qiáng)的假設(shè)條件,即所有的人臉圖像必須是事先嚴(yán)格對齊的,否則,稀疏性很難滿足。換言之,對于表情變化,姿態(tài)角度變化的人臉都不滿足稀疏性這個(gè)假設(shè)。所以,經(jīng)典的稀疏臉方法很難用于真實(shí)的應(yīng)用場景。稀疏臉很強(qiáng)的地方在于對噪聲相當(dāng)魯棒,相關(guān)文獻(xiàn)表明,即使人臉圖像被80%的隨機(jī)噪聲干擾,仍然能夠得到很高的識別率。稀疏臉另外一個(gè)很強(qiáng)的地方在于對于部分遮擋的情況,例如戴圍巾,戴眼鏡等,
4、仍然能夠保持較高的識別性能。上述兩點(diǎn),是其它任何傳統(tǒng)的人臉識別方法所不具有的。1.2 RSC算法簡介魯棒的稀疏編碼算法(Robust Sparse Coding , 簡稱RSC算法),是通過求解Lasso問題,進(jìn)而求解稀疏編碼問題,是SRC的改進(jìn)算法之一,具有極強(qiáng)的應(yīng)用性,最初是由Meng Yang, Lei Zhang等人在2011年的Robust Sparse Coding for Face Recognition一文中將RSC算法應(yīng)用到人臉識別領(lǐng)域。該文作者沒有直接求解稀疏編碼問題,而是求解Lasso問題,因?yàn)長asso問題的解和稀疏編碼的解是等價(jià)的。在傳統(tǒng)的SRC框架下,編碼誤差使用L
5、2范數(shù)來度量的,這也就意味著編碼誤差滿足高斯分布,然而,當(dāng)人臉圖像出現(xiàn)遮擋和噪聲污染的情況下,并非如此。在字典學(xué)習(xí)框架下,這樣的字典是有噪聲的。該文作者對原始Lasso問題進(jìn)行改進(jìn),求解加權(quán)L1范數(shù)約束的線性回歸問題。 人臉識別的魯棒稀疏編碼的稀疏表示識別方法將稀疏表示的保真度表示為余項(xiàng)的L2范數(shù),但最大似然估計(jì)理論證明這樣的假設(shè)要求余項(xiàng)服從高斯分布,實(shí)際中這樣的分布可能并不成立,特別是當(dāng)測試圖像中存在噪聲、遮擋和偽裝等異常像素,這就導(dǎo)致傳統(tǒng)的保真度表達(dá)式所構(gòu)造的稀疏表示模型對上述這些情況缺少足夠的魯棒性。而最大似然稀疏表示識別模型則基于最大似然估計(jì)理論,將保真度表達(dá)式改寫為余項(xiàng)的最大似然分布
6、函數(shù),并將最大似然問題轉(zhuǎn)化為一個(gè)加權(quán)優(yōu)化問題,在稀疏表示的同時(shí)引入代表各像素不同權(quán)值的矩陣,使得該算法對于圖像中包含異常像素的情況表現(xiàn)出很好的魯棒性。 此算法的關(guān)鍵還在于權(quán)重系數(shù)的確定,文中采用的是logistic函數(shù),而具體的實(shí)現(xiàn)則是通過迭代估計(jì)學(xué)習(xí)得到。該方法基于這樣一個(gè)事實(shí):被遮擋或噪聲干擾的像素點(diǎn)賦予較小的權(quán)重,而其它像素點(diǎn)的權(quán)重相對較大。具體迭代算法采用經(jīng)典的迭代重加權(quán)算法框架,當(dāng)然內(nèi)部嵌入的稀疏編碼的求解過程。此算法在50%遮擋面積的情況下取得的更好更滿意的結(jié)果。但是文中沒有比較計(jì)算時(shí)間上的優(yōu)略而直說和SRC框架差不多。2.算法步驟2.1 SRC算法步驟具體的SRC算法步驟如Spa
7、re Representation-based Classification(SRC)所示2.2 RSC算法步驟稀疏編碼模型等同于求解LASSO問題,LASSO問題模型如公式1所示(1) 0,是一個(gè)常數(shù),表示被編碼的信號,表示含有m個(gè)dj 列向量的字典集, 是編碼系數(shù)向量,在我們?nèi)四樧R別問題中,dj 表示訓(xùn)練人臉樣本,字典集D表示訓(xùn)練集。加權(quán)Lasso問題的目標(biāo)函數(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)個(gè)非零值 W=sparse(,train_tol,ClassNum,length(train_x); %得到每類對應(yīng)的系數(shù) for j=1:ClassNum ind=(j=train_label); W(ind,j)=train_x(ind); end %計(jì)算測試樣本和每類重構(gòu)樣本之間的殘差 temp=train_sample*W-repmat(test_clean,1,ClassNum); residu
10、al=sqrt(sum(temp.2); %把測試樣本分在最小殘差對應(yīng)的類別中 ,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;%進(jìn)行10次迭代運(yùn)算% % 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;%計(jì)算剩余%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); %迭代運(yùn)算%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 %分類標(biāo)記%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.實(shí)驗(yàn)4.1通過SRC和RSC進(jìn)行同一維度下同一人臉面部不同遮擋面積下的人臉識別的實(shí)驗(yàn)在圖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)實(shí)驗(yàn)對比發(fā)現(xiàn),SRC和RS
15、C算法在同一維度下對被遮擋的同一人臉圖像都有較好的識別,在遮擋面積0%10%下,SRC與RSC算法的人臉識別率均為100%;在人臉遮擋面積20%的時(shí)候,SRC為99.8%,識別率已經(jīng)不是100%,但RSC仍然為100%;RSC算法是直到人臉遮擋面積超過30%后識別率才有所下降,不過與SRC人臉遮擋面積20%下的識別率相等。在由此可見RSC算法的對于遮擋下的人臉識別具有更好的識別效果,通過RSC魯棒性稀疏編碼算法對SRC算法的改進(jìn)在遮擋人臉識別上是成功的。4.2通過SRC和RSC進(jìn)行不同維度下人臉面部同一遮擋下的人臉識別的實(shí)驗(yàn)使用Extended Yale B人臉數(shù)據(jù)庫進(jìn)行不同維度下人臉面部同一
16、遮擋下的人臉識別的實(shí)驗(yàn),Extended Yale B 數(shù)據(jù)庫中包含啦2414張人臉正面圖,這些人臉圖片分為38組,每張圖片都是54*48的人臉圖片。在實(shí)驗(yàn)過程中,我們將整個(gè)數(shù)據(jù)庫的人臉圖片隨機(jī)分為兩部分,一部分作為作為字典圖集,一部分作為測試圖集。然后通過SRC和RSC進(jìn)行不同維度下人臉面部同一遮擋下的人臉識別的實(shí)驗(yàn)。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)實(shí)驗(yàn)對比發(fā)現(xiàn),SRC和RSC算法不同維度下人臉面部同一遮擋下的的人臉圖像都有較好的識別,伴隨著維度的提升30維度300維度,SRC和RSC對遮擋的人臉識別率都呈現(xiàn)了較好的上升效果,并且RSC算法人臉識別率上升速度要快于SRC算法的人臉識別率上升速度;在300維度以上,RSC算法的識別率已經(jīng)超過了99%,而SRC算法的識別率未達(dá)到99%,從也可以看出RSC算法在遮擋人臉識別方面有著優(yōu)于SRC算法的識別效果,進(jìn)一步證明了通過RSC魯棒性稀疏編碼算法
18、對SRC算法的改進(jìn)在遮擋人臉識別上是成功的。5.結(jié)論在本實(shí)驗(yàn)中,我們分別通過SRC與RSC算法對遮擋人臉圖像分別做了通過SRC和RSC進(jìn)行同一維度下同一人臉面部不同遮擋面積下的人臉識別的實(shí)驗(yàn)和通過SRC和RSC進(jìn)行不同維度下人臉面部同一遮擋下的人臉識別的實(shí)驗(yàn),最終實(shí)驗(yàn)結(jié)果均表明啦SRC和RSC對遮擋人臉識別都具有較好的識別效果,而RSC作為SRC的改進(jìn)算法之一,凸顯了自身的優(yōu)勢,大大提高了遮擋人臉圖像的識別率。參考文獻(xiàn)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é)主要介紹圖形模式的初始化、獨(dú)立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時(shí)要確保有顯示器圖形驅(qū)動程序*.BGI,同時(shí)將集成開發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖
21、形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時(shí)所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initgraph(int far *gdriver, int far *gmode,char *path);其中g(shù)driver和gmode分別表示圖形驅(qū)動器和模式,path是指圖形驅(qū)動程序所在的目錄路徑。有關(guān)圖形驅(qū)動器、圖形模式的符號常數(shù)及對應(yīng)的分辨率見graphics. h。圖形驅(qū)動程序由Tu
22、rbo C出版商提供,文件擴(kuò)展名為.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;有時(shí)編程者并不知道所用的圖形顯示器適配
23、器種類,或者需要將編寫的程序用于不同圖形驅(qū)動器,Turbo C 提供了一個(gè)自動檢測顯示器硬件的函數(shù),其調(diào)用格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動進(jìn)行硬件測試后進(jìn)行圖形初始化:#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ù)進(jìn)行初始化設(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è)置和清屏函數(shù)對于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在Turbo C中分別用下面兩個(gè)函數(shù): 設(shè)置背景色: void far setbkcolor
26、(int color);設(shè)置作圖色: void far setcolor(int color);其中color 為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關(guān)顏色的符號常數(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); /*設(shè)置圖形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*設(shè)置不同作圖色*/circle(320, 240, 20+i*10); /*畫半徑不同的圓*/getch();for(i=0; i=15; i+)setbkcolor(i); /*設(shè)置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURB
28、O C也提供了幾個(gè)獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。 int far getbkcolor(void); 返回現(xiàn)行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫圖函數(shù)基本圖形函數(shù)包括畫點(diǎn),線以及其它一些基本圖形的函數(shù)。本節(jié)對這些函數(shù)作一全面的介紹。 、畫點(diǎn). 畫點(diǎn)函數(shù) void far putpixel(int x, int y, int color); 該函數(shù)表示有指定的象元畫一個(gè)按color 所確定顏色的點(diǎn)。對于顏色color的值可從表3中獲得而對x, y是指圖形象元的坐標(biāo)
29、。在圖形模式下,是按象元來定義坐標(biāo)的。對VGA適配器,它的最高分辨率為640 x480,其中640為整個(gè)屏幕從左到右所有象元的個(gè)數(shù),480為整個(gè)屏幕從上到下所有象元的個(gè)數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖形函數(shù)都是相對于圖形屏幕坐標(biāo),即象元來說的。關(guān)于點(diǎn)的另外一個(gè)函數(shù)是: int far getpixel(int x, int y); 它獲得當(dāng)前點(diǎn)(x, y)的顏色值。 II、有關(guān)坐標(biāo)位置的函數(shù) int far getmaxx(void);返回x軸的最大值。int far getmaxy
30、(void);返回y軸的最大值。int far getx(void); 返回游標(biāo)在x軸的位置。void far gety(void); 返回游標(biāo)有y軸的位置。void far moveto(int x, int y); 移動游標(biāo)到(x, y)點(diǎn),不是畫點(diǎn),在移動過程中亦畫點(diǎn)。void far moverel(int dx, int dy); 移動游標(biāo)從現(xiàn)行位置(x, y)移動到(x+dx, y+dy)的位置,移動過程中不畫點(diǎn)。、畫線I. 畫線函數(shù)TURBO C提供了一系列畫線函數(shù): void far line(int x0, int y0, int x1, int y1); 畫一條從點(diǎn)(x0,
31、 y0)到(x1, y1)的直線。void far lineto(int x, int y); 畫一作從現(xiàn)行游標(biāo)到點(diǎn)(x, y)的直線。void far linerel(int dx, int dy); 畫一條從現(xiàn)行游標(biāo)(x,y)到按相對增量確定的點(diǎn)(x+dx, y+dy)的直線。void far circle(int x, int y, int radius); 以(x, y)為圓心,radius為半徑,畫一個(gè)圓。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軸正向?yàn)? 度,逆時(shí)針方向旋轉(zhuǎn)一周, 依次為90,180, 270和360度(其它有關(guān)函數(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é)束畫一段橢圓線,當(dāng)stangle=0,endangle=360時(shí), 畫出一個(gè)完整的橢圓。void far rectangle(in
33、t x1, int y1, int x2, inty2); 以(x1, y1)為左上角,(x2, y2)為右下角畫一個(gè)矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫一個(gè)頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2 倍頂點(diǎn)數(shù)個(gè)無素。每一個(gè)頂點(diǎn)的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個(gè)封閉的多邊形時(shí),numpoints 的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個(gè)和最后一個(gè)點(diǎn)的坐標(biāo)相同。下面舉一個(gè)用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); /*設(shè)置作圖顏色*/drawpoly(8, arw); /*畫一箭頭*/getch();closegraph
35、();return 0;II、設(shè)定線型函數(shù)在沒有對線的特性進(jìn)行設(shè)定之前,TURBO C 用其默認(rèn)值,即一點(diǎn)寬的實(shí)線,但TURBO C 也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點(diǎn)寬和三點(diǎn)寬。而線的形狀則有五種。下面介紹有關(guān)線型的設(shè)置函數(shù)。void far setlinestyle(int linestyle,unsigned upattern,int thickness);該函數(shù)用來設(shè)置線的有關(guān)信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。對于upattern,只有l(wèi)inestyle選USERBIT_LINE 時(shí)才有意義 (選其它線型,up
36、pattern取0即可)。此時(shí)uppattern的16位二進(jìn)制數(shù)的每一位代表一個(gè)象元,如果那位為1,則該象元打開,否則該象元關(guān)閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數(shù)將有關(guān)線的信息存放到由lineinfo 指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面兩句程序可以讀出當(dāng)前線的特性 struct linesettingstype *info
37、;getlinesettings(info);void far setwritemode(int mode);該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時(shí)將所畫位置的原來信息覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫線時(shí)用現(xiàn)在特性的線與所畫之處原有的線進(jìn)行異或(XOR)操作,實(shí)際上畫出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫線操作相當(dāng)于沒有畫線。有關(guān)線型設(shè)定和畫線函數(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); /*設(shè)置三點(diǎn)寬實(shí)線*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*設(shè)置一點(diǎn)寬用戶定義線*/line(220, 240, 420, 240);line(320, 140, 320, 340
39、);getch();closegraph();return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色和圖模填滿一個(gè)封閉圖形。 一般是先畫輪廓再填充。TURBO C提供了一些先畫出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個(gè)封閉圖形的函數(shù)。在沒有改變填充方式時(shí),TURBO C 以默認(rèn)方式填充。 void far bar(int x1, int y1, int x2, int y2);確定一個(gè)以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說明:此函數(shù)不畫出邊框,所以填充色為邊框。void far bar3d(int x1, int y1, int x2,
40、int y2,int depth,int topflag);當(dāng)topflag為非0時(shí), 畫出一個(gè)三維的長方體。當(dāng)topflag為0時(shí),三維圖形不封頂,實(shí)際上很少這樣使用。說明: bar3d()函數(shù)中,長方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);畫一個(gè)以(x, y)為圓心,radius為半徑,stangle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360 時(shí)變成一個(gè)實(shí)心圓,并在圓內(nèi)從圓點(diǎn)
41、沿X軸正向畫一條半徑。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);畫一個(gè)以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設(shè)定填充方式TURBO C有四個(gè)與填充方式有關(guān)的函數(shù)。下面分別介紹: void far setfillstyle(int pattern, int color); color的值是當(dāng)前屏幕圖形模式時(shí)顏色的有效值。pattern的值及與其等價(jià)的符號常數(shù)見
42、graphics.h。除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle() 函數(shù)設(shè)置。當(dāng)選用USER_FILL時(shí),該函數(shù)對填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時(shí)用到此項(xiàng)。void far setfillpattern(char * upattern,int color); 設(shè)置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個(gè)指向8個(gè)字節(jié)的指針。這8個(gè)字節(jié)定義了8x8點(diǎn)陣的圖形。每個(gè)字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn),8個(gè)字節(jié)表示8行,然后以此為模型向個(gè)封閉區(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)行填充模式 * /; 有關(guā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;/*定義一個(gè)用來存儲填充信息的結(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); /* 設(shè)置填充類型 */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é) 任意封閉圖形的填充截止目前為止,我們只能對一些特定形狀的封閉圖形進(jìn)行填充,但還不能對任意封閉圖形進(jìn)行填充。為此,TURBO C 提供了一個(gè)可對任意封閉圖形填充的函數(shù),其調(diào)用格式如下: void far floodfill(int x, int
47、 y, int border); 其中:x, y為封閉圖形內(nèi)的任意一點(diǎn),border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個(gè)封閉圖形。注意:a. 如果x或y取在邊界上,則不進(jìn)行填充。b. 如果不是封閉圖形則填充會從沒有封閉的地方溢出去,填滿其它地方。c. 如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。d. 由border指定的顏色值必須與圖形輪廓的顏色值相同, 但填充色可選任意顏色。下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫長方體中其它兩個(gè)未填充的面。#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); /*設(shè)置填充方式*/bar3d(100,200,400,350,200,1); /*畫長方體并填充*/floodfill(450,300,LIGHTRED);/*
49、填充長方體另外兩個(gè)面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*畫一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七節(jié)屏幕操作函數(shù)除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù): void far setactivepage(int pagenum); void far setvisualpage(int pagenum);這兩個(gè)函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁
50、。所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁面,該頁面并不一定可見。setvisualpage()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(Turbo C默認(rèn)頁)。如果先用setactivepage() 函數(shù)在不同頁面上畫出一幅幅圖像,再用setvisualpage() 函數(shù)交替顯示,就可以實(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);這三個(gè)函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize() 測試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部內(nèi)容需多少個(gè)字節(jié),然后再給mapbuf分配一個(gè)所測數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時(shí)可用putimage()函數(shù)將該圖像輸出到左上角為點(diǎn)(x, y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。 關(guān)于這個(gè)參數(shù)的定義參見下表。對于imag
52、esize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會出錯,出錯時(shí)返回-1。本節(jié)介紹的函數(shù)在圖像動畫處理、菜單設(shè)計(jì)技巧中非常有用。下面程序模擬兩個(gè)小球動態(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é)用戶對文本字符大小的設(shè)置前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對于筆劃型字體(除8*8點(diǎn)陣字以個(gè)的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。 為此Turbo C2.0又提供了另外一個(gè)setusercharsize() 函數(shù),對筆劃字體可以分別設(shè)置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為: void fa
55、r setusercharsize(int mulx, intdivx, int muly, int divy); 該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時(shí)才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。 調(diào)用函數(shù)setusercharsize()后,每個(gè)顯示在屏幕上的字符都以其缺省大小乘以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); /*設(shè)置填充方式*/setcolor(WHITE); /*設(shè)置白色作圖*/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è)置有關(guān)圖形方式下的文本輸出函數(shù),可以通過setcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變
58、文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。 void far settexjustify(int horiz, int vert); 該函數(shù)用于定位輸出字符串。對使用outtextxy(int x, int y, char far *str textstring)函數(shù)所輸出的字符串,其中哪個(gè)點(diǎn)對應(yīng)于定位坐標(biāo)(x,y)在TurboC2.0中是有規(guī)定的。如果把一個(gè)字符串看成一個(gè)長方形的圖形,在水平方向顯示時(shí),字符串長方形按垂直方向可分為頂部,中部和底部三個(gè)位置,水平方向可分為左,中,右三個(gè)位置,兩者結(jié)合就有9個(gè)位置。settextjustify()函數(shù)的第一個(gè)參數(shù)horiz 指出水平方向
59、三個(gè)位置中的一個(gè),第二個(gè)參數(shù)vert指出垂直方向三個(gè)位置中的一個(gè),二者就確定了其中一個(gè)位置。當(dāng)規(guī)定了這個(gè)位置后,用outtextxy() 函數(shù)輸出字符串時(shí), 字符串長方形的這個(gè)規(guī)定位置就對準(zhǔn)函數(shù)中的(x,y)位置。而對用uttext()函數(shù)輸出字符串時(shí),這個(gè)規(guī)定的位置就位于現(xiàn)行游標(biāo)的位置。 有關(guān)參數(shù)horiz和vert的取值參見graphics.h。void far settextstyle(int font, int direction,int charsize); 該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性
60、。 Turbo C2.0對函數(shù)中各個(gè)參數(shù)的規(guī)定見graphics.h。有關(guān)圖形屏幕下文本輸出和字體字型設(shè)置函數(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);/*定義一個(gè)圖形窗口*/setfillstyle(1, 2); /*綠色以實(shí)填
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年勞務(wù)國際合作合同
- 2025年公司員工個(gè)人借款合同協(xié)議范本
- 2025年養(yǎng)老機(jī)構(gòu)醫(yī)療協(xié)作合同
- 2025年典范建筑設(shè)計(jì)與施工合同格式
- 2025年公寓式酒店設(shè)計(jì)施工合同
- 2025年五星級酒店運(yùn)營總監(jiān)勞動合同范文
- 2025年住宅測繪服務(wù)合同范本
- 2025年公務(wù)車輛維修保養(yǎng)服務(wù)合同樣本
- 2025年合同調(diào)整記錄模板
- 2025年插畫合作合同樣本
- 2024年山東工程職業(yè)技術(shù)大學(xué)單招職業(yè)傾向性測試題庫(500題)含答案解析
- 2024至2030年串葉松香草種子項(xiàng)目投資價(jià)值分析報(bào)告
- 生活垃圾我知道(課件)二年級下冊勞動
- 事業(yè)單位考試職業(yè)能力傾向測驗(yàn)(醫(yī)療衛(wèi)生類E類)試卷及答案指導(dǎo)
- 每日系列-計(jì)算小紙條-3年級下冊
- 2024年廣西區(qū)公務(wù)員考試《行測》真題及答案解析
- 化工安全 教案 第三章 燃燒與爆炸理論基礎(chǔ)
- 第二單元 社會主義制度的建立與社會主義建設(shè)的探索(單元解讀)- 八年級歷史下冊同步備課系列
- 新能源汽車維護(hù)與故障診斷課件 項(xiàng)目一 安全防護(hù)知識與應(yīng)用
- 闌尾炎的護(hù)理查房腹腔鏡
- 大學(xué)輔導(dǎo)員崗位考核參考指標(biāo)
評論
0/150
提交評論