畢業(yè)論文---人像識(shí)別與認(rèn)證——圖像的采集 (含外文翻譯)_第1頁
已閱讀1頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  畢 業(yè) 論 文</b></p><p>  論文題目 人像識(shí)別與認(rèn)證——圖像的采集 </p><p>  導(dǎo)師姓名     </p><p>  作者姓名      </p><p>  準(zhǔn)考證號(hào) 

2、 </p><p>  作者單位 </p><p>  完成時(shí)間 2012年 08月 21日 </p><p><b>  摘 要</b></p><p>  當(dāng)今社會(huì)和經(jīng)濟(jì)的快速發(fā)展,使得安全

3、、快速并準(zhǔn)確地進(jìn)行身份識(shí)別變得越來越重要。傳統(tǒng)的身份驗(yàn)證方法多采用密碼,這種方法存在兩個(gè)缺點(diǎn):密碼容易忘記;密碼存在被別人盜用的危險(xiǎn)。由于生物特征是人體的內(nèi)在屬性,具有很強(qiáng)的自身穩(wěn)定性和個(gè)體差異性,所以人體的生物特征是進(jìn)行身份識(shí)別最理想的依據(jù)。使用人體生物特征識(shí)別技術(shù)進(jìn)行身份驗(yàn)證,克服了使用密碼的缺點(diǎn)。基于人像的身份認(rèn)證是生物特征身份認(rèn)證的一種方式,在抗干擾性、精確度、代價(jià)和性能等指標(biāo)上要優(yōu)于其它生物特征身份認(rèn)證方式。 </p&g

4、t;<p>  利用計(jì)算機(jī)分析人臉圖像,進(jìn)而從中提取出有效的識(shí)別信息,用來“辨認(rèn)”身份。其應(yīng)用領(lǐng)域廣泛,近年來,人臉和面部表情識(shí)別已經(jīng)吸引了更多科研人員的注意。</p><p>  本系統(tǒng)功能包括:攝像頭軟件驅(qū)動(dòng)、人像抓拍、圖像文件存取,簡(jiǎn)單比較功能。采用Visual C++ 6.0作為開發(fā)工具,運(yùn)行環(huán)境為Window XP。</p><p>  系統(tǒng)通過調(diào)試DirectSh

5、ow實(shí)現(xiàn)對(duì)視頻設(shè)備的驅(qū)動(dòng),并對(duì)瞬時(shí)視頻實(shí)現(xiàn)捕捉,然后依據(jù)BMP文件格式,將捕獲的人像圖片保存為BMP位圖文件,并存在指定目錄中。采用歐氏距離的算法實(shí)現(xiàn)兩張人像的比較,再將比較的結(jié)果輸出到界面上。其中界面的構(gòu)建完全基于VC開發(fā),具有直觀性。</p><p>  關(guān)鍵詞: 人像識(shí)別;DirectShow;BMP位圖文件;VC++</p><p><b>  Abstract</

6、b></p><p>  Nowadays, the rapid development of society and economy makes safe, fast and accurate identity becomes increasingly important. Traditional authentication method often uses a password, but this

7、approach has two disadvantages: the password easy to forget and dangers of piracy to others. Because the biometric is the intrinsic property of the human body, with strong own stability and individual differences, the bo

8、dy's biometric identity is the ideal basis of authentication. Using human biometric tech</p><p>  We use a computer to analyze the human face and then extract valid identification information, aiming to

9、"recognize" identity. Its application areas are wide and in recent years, the face and facial expression recognition have attracted more attention from researchers. </p><p>  This system features i

10、nclude: the camera software driven, portrait shoot, image and file access, simple comparison capabilities. It use Visual C++ 6.0 as its development tool and its running environment is Window XP. </p><p>  Th

11、e system, by debugging DirectShow, realizes to drive video device and capture the instantaneous video. Then according to BMP file format, we can save the captured portrait picture as a BMP bitmap file and store it in the

12、 specified directory. It uses Euclidean distance algorithm to compare two portraits, and then output the result to the interface, whose construction is entirely based on VC, with visualization.</p><p>  Key

13、words: Recognition ;DirectShow ;BMP bitmap files;VC+ +</p><p><b>  目 錄</b></p><p>  第1章 緒 論1</p><p><b>  1.1概述1</b></p><p>  1.2人像識(shí)別的優(yōu)勢(shì)2<

14、;/p><p>  1.3人像識(shí)別的應(yīng)用2</p><p>  1.4國(guó)內(nèi)外現(xiàn)狀及發(fā)展趨勢(shì)2</p><p>  第二章 開發(fā)環(huán)境及編程語言介紹4</p><p>  2.1 Visual C++ 簡(jiǎn)介4</p><p>  2.2 C /C++語言的特點(diǎn)概述5</p><p>  2.3

15、 C++語言發(fā)展6</p><p>  2.4面對(duì)對(duì)象的C++語言類及繼承的特點(diǎn)6</p><p>  2.4.1結(jié)構(gòu)體與類以及類的繼承6</p><p>  2.4.2構(gòu)造函數(shù)與析構(gòu)函數(shù)8</p><p>  2.4.3類中函數(shù)覆蓋的問題9</p><p>  第三章 開發(fā)技術(shù)介紹及圖像存儲(chǔ)格式10<

16、;/p><p>  3.1 Direct Show技術(shù)簡(jiǎn)介10</p><p>  3.1.1 Direct Show簡(jiǎn)介10</p><p>  3.1.2 Direct Show系統(tǒng)10</p><p>  3.2 Direct Show的下載安裝12</p><p>  3.3使用VMR技術(shù)實(shí)現(xiàn)視頻圖像捕獲

17、15</p><p>  3.3.1 VMR技術(shù)基礎(chǔ)15</p><p>  3.3.2視頻圖像捕獲類CVMR_Capture的實(shí)現(xiàn)16</p><p>  3.4BMP格式介紹17</p><p>  3.4.1簡(jiǎn)介17</p><p>  3.4.2文件結(jié)構(gòu)18</p><p> 

18、 第四章 人像識(shí)別與認(rèn)證方法研究22</p><p>  4.1人臉檢測(cè)定位22</p><p>  4.2面部特征的提取24</p><p>  4.3人臉確認(rèn)識(shí)別25</p><p>  第五章 系統(tǒng)程序的分析27</p><p>  5.1系統(tǒng)功能模塊圖27</p><p> 

19、 5.2功能模塊程序具體分析27</p><p>  5.2.1抓拍程序27</p><p>  5.2.2抓拍流程圖29</p><p>  5.2.3獲取模板程序30</p><p>  5.2.4獲取模板流程圖32</p><p>  5.3系統(tǒng)生成界面33</p><p> 

20、 第六章 系統(tǒng)測(cè)試與運(yùn)行結(jié)果34</p><p>  6.1調(diào)試與測(cè)試34</p><p>  6.1.1程序調(diào)試34</p><p>  6.1.2分調(diào)34</p><p>  6.1.3總調(diào)34</p><p>  6.2系統(tǒng)測(cè)試34</p><p>  第七章 技術(shù)經(jīng)濟(jì)分析3

21、6</p><p>  7.1技術(shù)分析36</p><p>  7.2經(jīng)濟(jì)分析36</p><p><b>  結(jié) 論39</b></p><p><b>  致 謝40</b></p><p><b>  參考文獻(xiàn)41</b></p

22、><p>  附錄1 中文翻譯42</p><p>  附錄2 外文原文49</p><p><b>  第1章 緒 論</b></p><p>  以計(jì)算機(jī)和網(wǎng)絡(luò)為代表的信息技術(shù),具有國(guó)際化、社會(huì)化、開放化、個(gè)性化的特點(diǎn),在提供了“信息共享”的同時(shí),也使得信息安全問題倍受關(guān)注,能否進(jìn)行正確的身份認(rèn)證已成為解決問題的關(guān)

23、鍵。</p><p>  傳統(tǒng)的身份認(rèn)證方式,如密碼、證件、電子卡等,容易被遺忘、丟失和偽造,基于生物特征的身份認(rèn)證因其廣泛性、唯一性、穩(wěn)定性、攜帶方便、易采集等特點(diǎn),被稱為“可能改變世界的十大新興技術(shù)”之一?;谌讼褡R(shí)別的身份認(rèn)證在抗干擾性、精確度、代價(jià)、性能等指標(biāo)上綜合比較,優(yōu)于基于聲音、指紋、掌紋、虹膜、簽名等特征的身份認(rèn)證。</p><p>  基于人像識(shí)別的身份認(rèn)證利用計(jì)算機(jī)對(duì)給

24、定的靜止圖像或者動(dòng)態(tài)圖像序列進(jìn)行處理,對(duì)人臉部部件特征和之間的關(guān)系進(jìn)行分析,從中提取出有效的認(rèn)證信息,基于已有的人像數(shù)據(jù)庫(kù)來“辨認(rèn)”或者“確認(rèn)”一個(gè)或多個(gè)人的身份。基于人像識(shí)別的身份認(rèn)證技術(shù)以其出眾的用戶友好性和易用性等特點(diǎn),成為了一項(xiàng)非常有潛力的身份認(rèn)證技術(shù)。</p><p><b>  1.1概述</b></p><p>  人像識(shí)別,又叫人臉識(shí)別,特指利用分析比

25、較人臉視覺特征信息進(jìn)行身份鑒別的計(jì)算機(jī)技術(shù)。廣義的人像識(shí)別實(shí)際包括構(gòu)建人像識(shí)別系統(tǒng)的一系列相關(guān)技術(shù),包括人臉圖像采集、人臉定位、人像識(shí)別預(yù)處理、身份確認(rèn)以及身份查找等[1];而狹義的人像識(shí)別特指通過人臉進(jìn)行身份確認(rèn)或者身份查找的技術(shù)或系統(tǒng)。</p><p>  人像識(shí)別是一項(xiàng)熱門的計(jì)算機(jī)技術(shù)研究領(lǐng)域,它屬于生物特征識(shí)別技術(shù),是對(duì)生物體(一般特指人)本身的生物特征來區(qū)分生物體個(gè)體。生物特征識(shí)別技術(shù)所研究的生物特征包

26、括臉、指紋、手掌紋、虹膜、視網(wǎng)膜、聲音(語音)、體形、個(gè)人習(xí)慣(例如敲擊鍵盤的力度和頻率、簽字)等,相應(yīng)的識(shí)別技術(shù)就有人像識(shí)別、指紋識(shí)別、掌紋識(shí)別、虹膜識(shí)別、視網(wǎng)膜識(shí)別、語音識(shí)別(用語音識(shí)別可以進(jìn)行身份識(shí)別,也可以進(jìn)行語音內(nèi)容的識(shí)別,只有前者屬于生物特征識(shí)別技術(shù))、體形識(shí)別、鍵盤擊識(shí)別、簽字識(shí)別等。一般來說,人像識(shí)別系統(tǒng)包括圖像攝取、人臉定位、圖像預(yù)處理、以及人像識(shí)別(身份確認(rèn)或者身份查找)。系統(tǒng)輸入一般是一張或者一系列含有未確定身份的

27、人臉圖像,以及人臉數(shù)據(jù)庫(kù)中的若干已知身份的人臉圖象或者相應(yīng)的編碼,而其輸出則是一系列相似度得分,表明待識(shí)別的人臉的身份。</p><p>  1.2人像識(shí)別的優(yōu)勢(shì)</p><p>  人像識(shí)別的優(yōu)勢(shì)在于其自然性和不被被測(cè)個(gè)體察覺的特點(diǎn)。 </p><p>  所謂自然性,是指該識(shí)別方式同人類(甚至其他生物)進(jìn)行個(gè)體識(shí)別時(shí)所利用的生物特征相同。例如人像識(shí)別,人類也是通

28、過觀察比較人臉區(qū)分和確認(rèn)身份的,另外具有自然性的識(shí)別還有語音識(shí)別、體形識(shí)別等,而指紋識(shí)別、虹膜識(shí)別等都不具有自然性,因?yàn)槿祟惢蛘咂渌锊⒉煌ㄟ^此類生物特征區(qū)別個(gè)體。 </p><p>  不被察覺的特點(diǎn)對(duì)于一種識(shí)別方法也很重要,這會(huì)使該識(shí)別方法不令人反感,并且因?yàn)椴蝗菀滓鹑说淖⒁舛蝗菀妆黄垓_。人像識(shí)別具有這方面的特點(diǎn),它完全利用可見光獲取人臉圖像信息,而不同于指紋識(shí)別或者虹膜識(shí)別,需要利用電子壓力傳感器采集

29、指紋,或者利用紅外線采集虹膜圖像,這些特殊的采集方式很容易被人察覺,從而更有可能被偽裝欺騙。</p><p>  1.3人像識(shí)別的應(yīng)用</p><p>  人像識(shí)別的應(yīng)用主要有: </p><p> ?。?)公安刑偵破案:通過查詢目標(biāo)人像數(shù)據(jù)尋找數(shù)據(jù)庫(kù)中是否存在重點(diǎn)人口基本信息。例如在機(jī)場(chǎng)或車站安裝系統(tǒng)以抓捕在逃案犯。 </p><p>  

30、(2)門禁系統(tǒng):受安全保護(hù)的地區(qū)可以通過人像識(shí)別辨識(shí)試圖進(jìn)入者的身份。 </p><p>  (3)攝像監(jiān)視系統(tǒng):例如在機(jī)場(chǎng)、體育場(chǎng)、超級(jí)市場(chǎng)等公共場(chǎng)所對(duì)人群進(jìn)行監(jiān)視,以達(dá)到身份識(shí)別的目的。例如在機(jī)場(chǎng)安裝監(jiān)視系統(tǒng)以防止恐怖分子登機(jī)。 </p><p> ?。?)網(wǎng)絡(luò)應(yīng)用:利用人像識(shí)別輔助信用卡網(wǎng)絡(luò)支付,以防止非信用卡的擁有者使用信用卡等。</p><p>  1.4

31、國(guó)內(nèi)外現(xiàn)狀及發(fā)展趨勢(shì)</p><p>  從20世紀(jì)60年代末至今,基于人像識(shí)別的認(rèn)證研究的發(fā)展經(jīng)歷了如下四個(gè)階段:</p><p> ?。?)基于簡(jiǎn)單背景的人像識(shí)別階段:這是人像識(shí)別身份認(rèn)證研究的初級(jí)階段。始于60年代末,通常利用人像器官的局部特征來描述人像。但由于人像器官?zèng)]有顯著的邊緣且易受到表情的影響。因此它僅限于正面人像(變形較小)的識(shí)別。</p><p>

32、 ?。?)基于多姿態(tài)/表情的人像識(shí)別階段:這是人像識(shí)別身份認(rèn)證研究的發(fā)展階段。始于70年代末,但到90年代初才被人們真正關(guān)注,進(jìn)行專門研究。</p><p> ?。?)動(dòng)態(tài)跟蹤人像識(shí)別階段:這是人像識(shí)別身份認(rèn)證研究的實(shí)用化階段。始于9O年代末,特別是“9.11”事件促進(jìn)了動(dòng)態(tài)人臉跟蹤技術(shù)的快速發(fā)展。</p><p> ?。?)三維人臉識(shí)別階段:為了獲得更多的特征信息。直接利用二維人臉圖像合

33、成三維人臉模型進(jìn)行識(shí)別也成為該領(lǐng)域的一個(gè)主要研究方向。</p><p>  目前,國(guó)內(nèi)及國(guó)外均已出現(xiàn)成型的基于人像識(shí)別的身份認(rèn)證系統(tǒng),國(guó)外有Facelt,F(xiàn)aceVACS,Cognitec,Identix和Eyematic,美國(guó)A4Vision還推出3D人像識(shí)別系統(tǒng);國(guó)內(nèi)有清華大學(xué)承擔(dān)的國(guó)家“十五”攻關(guān)項(xiàng)目——人像識(shí)別系統(tǒng)、銀晨智能識(shí)別有限公司研制的嵌入式人像識(shí)別系統(tǒng)、廣州超越數(shù)碼科技有限公司的BioFace系統(tǒng)

34、等。這些產(chǎn)品取得了較好的認(rèn)證效果。</p><p>  第二章 開發(fā)環(huán)境及編程語言介紹</p><p>  2.1 Visual C++ 簡(jiǎn)介</p><p>  Visual C++提供了可視化的集成開發(fā)環(huán)境,包括AppWizard、WorkSpace、ClassWizard和WizardBar等實(shí)用開發(fā)工具。Visual C++即VC,微軟公司出品的高級(jí)可視化計(jì)

35、算機(jī)程序開發(fā)工具。他提供了一套開發(fā)環(huán)境:Visual Studio,Visual Studio本身包括一個(gè)文本編輯器、資源編輯器、工程編譯工具、一個(gè)增量連接器、源代碼瀏覽器、集成調(diào)試工具,以及一套聯(lián)機(jī)文檔,借助這套工具,用戶可以隨心所欲地開發(fā)出各種功能的應(yīng)用軟件以及借助OpenGL和DirectX技術(shù)開發(fā)游戲軟件。Visual C++可以識(shí)別C/C++并編譯,支持MFC類庫(kù),并提供了一系列模板,常用的MFC AppWizard(EXE/

36、DLL),MFC ActiveX ControlWizard,Win32 Application,Win32 Console Application,ATL COM AppWizard。這種可視化編程環(huán)境可以令程序員花更多精力在程序功能的實(shí)現(xiàn)上,而不是底層的建設(shè)上,這就大大加快了程序開發(fā)速度和效率,這也是Visual C++一個(gè)顯著的特點(diǎn)。利用Visua</p><p>  (1)是Windows環(huán)境下最主要的應(yīng)

37、用開發(fā)系統(tǒng)之一</p><p>  (2)是C++語言的集成開發(fā)環(huán)境</p><p>  (3)與Win32緊密相連</p><p>  (4)強(qiáng)大的調(diào)試功能為大型的復(fù)雜軟件的開發(fā)提供了有效地排錯(cuò)手段</p><p>  開發(fā)環(huán)境是程序員同VC的交互界面,通過它可以創(chuàng)建工程文件、訪問資源編輯、使用內(nèi)部調(diào)試、訪問程序源代碼。</p>

38、<p>  利用API函數(shù)編寫Windows應(yīng)用程序,必須先了解以下內(nèi)容:</p><p><b>  (1)窗口的概念</b></p><p>  窗口是系統(tǒng)管理應(yīng)用程序的基本單位,是應(yīng)用程序與用戶接口之間交互的接口環(huán)境,是Win應(yīng)用程序基本操作單元。</p><p>  編寫一個(gè)Windows應(yīng)用程序首先應(yīng)創(chuàng)建一個(gè)或多個(gè)窗口,

39、隨后應(yīng)用程序的運(yùn)行過程即窗口的內(nèi)部,窗口與窗口之間,窗口與系統(tǒng)之間進(jìn)行數(shù)據(jù)處理與數(shù)據(jù)交換的過程。</p><p><b>  (2)事件驅(qū)動(dòng)概念</b></p><p>  Windows程序設(shè)計(jì)是針對(duì)事件或消息處理進(jìn)行。程序執(zhí)行順序取決于事件發(fā)生順序,程序的執(zhí)行順序是由順序產(chǎn)生的消息驅(qū)動(dòng)的。</p><p><b>  (3)句柄&

40、lt;/b></p><p>  應(yīng)用程序通過句柄來訪問相應(yīng)的對(duì)象信息。一個(gè)四字節(jié)長(zhǎng)的數(shù)值,用于標(biāo)示應(yīng)用程序中不同的對(duì)象和同類對(duì)象中不同的實(shí)例。</p><p><b>  (4)消息</b></p><p>  Windows應(yīng)用程序利用Windows消息與應(yīng)用程序及系統(tǒng)進(jìn)行信息交換。</p><p>  2.2

41、 C /C++語言的特點(diǎn)概述</p><p><b> ?。?)C語言特點(diǎn)</b></p><p>  C語言系列的編程語言是當(dāng)今非常流行的程序設(shè)計(jì)語言,它是由Dennis Richie在貝爾實(shí)驗(yàn)室研制開發(fā)的一個(gè)具有通用性的結(jié)構(gòu)化程序設(shè)計(jì)語言,它融匯了高效,靈活等設(shè)計(jì)思想,具有較高的可移植性。</p><p>  在實(shí)際運(yùn)用過程中可以發(fā)現(xiàn),C語

42、言的一個(gè)重要的特色是大量使用函數(shù)。比如,所有用C語言編寫的程序都必須具有一個(gè)名為main的函數(shù),該函數(shù)是程序的入口,也就是程序的執(zhí)行起點(diǎn),程序?qū)⒁淮螆?zhí)行main函數(shù)中的定義的代碼,直至main函數(shù)的執(zhí)行完畢,因此,main函數(shù)被成為主函數(shù)[2]。 除主函數(shù)外,C語言允許使用系統(tǒng)定義的其他函數(shù),也允許使用自定義的函數(shù)。</p><p>  C語言餓另一個(gè)重要特點(diǎn)是,比起其他編程語言來,C語言的使用非常靈活。比如在使

43、用典型的結(jié)構(gòu)化語言pascal時(shí),必須要實(shí)現(xiàn)在指定的區(qū)域聲明變量或函數(shù),然后在另一指定位置實(shí)現(xiàn)函數(shù)等。又比如,使用QBASIC語言,需要指定每行語句的行號(hào),程序?qū)创a的行號(hào)依次執(zhí)行。C語言在變量聲明、函數(shù)定義、語言的組織、算法設(shè)計(jì)等方面并沒有過于嚴(yán)格的限制。</p><p>  C語言區(qū)別于其他編程語言的特點(diǎn)是允許通過使用指針訪問變量或函數(shù)的存儲(chǔ)空間。由于C語言允許使用指針,使得它可以對(duì)計(jì)算機(jī)硬件進(jìn)行控制,這個(gè)

44、特點(diǎn)是其他高級(jí)程序語言不具備的。</p><p>  另外,C語言允許用戶使用自己定義的數(shù)據(jù)類型,這使得C語言在數(shù)據(jù)處理方面具有更大的優(yōu)勢(shì),程序員可以更具需要定義數(shù)據(jù)類型,并設(shè)計(jì)相應(yīng)的算法。</p><p> ?。?)C++語言特點(diǎn)</p><p>  C語言本身也存在一些局限,不如:C語言不支持代碼重用,C語言對(duì)類型的檢查機(jī)制相對(duì)較弱。為了解決C語言自身所具有的諸

45、多問題,1980年,貝爾實(shí)驗(yàn)室的Bjarne Stroutstrup博士及其同時(shí)開始對(duì)C語言進(jìn)行該經(jīng)和擴(kuò)充,并使C++語言在C語言的基礎(chǔ)上發(fā)展起來。</p><p>  在基本語法特點(diǎn)方面,C++語言保持與C語言兼并,二者沒有本質(zhì)上的差別,大多數(shù)使用C語言編寫的代碼可以在C++語言中直接使用。這也是C++語言很快普及的一個(gè)重要原因。C++語言與C語言的主要區(qū)別是編程思想上的更新,即編碼由面向過程變?yōu)槊嫦驅(qū)ο?,基?/p>

46、此,C++語言引入了類與對(duì)象機(jī)制,包括類的定于,類的繼承與派生,類的多態(tài)性等。在類定義方面,C++語言一方面自定義結(jié)構(gòu)類型進(jìn)行擴(kuò)充,另一方面也支持新的類構(gòu)造。數(shù)據(jù)封裝和隱藏是與類的定義緊密相關(guān),并且在C++語言中經(jīng)常碰到的現(xiàn)象,也是C++語言中的一大特點(diǎn)。</p><p>  2.3 C++語言發(fā)展</p><p>  C++語言發(fā)展大概可以分為三個(gè)階段:第一階段從80年代到1995年。這

47、一階段C++語言基本上是傳統(tǒng)類型上的面向?qū)ο笳Z言,并且憑借著接近C語言的效率,在工業(yè)界使用的開發(fā)語言中占據(jù)了相當(dāng)大份額;第二階段從1995年到2000年,這一階段由于標(biāo)準(zhǔn)模板庫(kù)(STL)和后來的Boost等程序庫(kù)的出現(xiàn),泛型程序設(shè)計(jì)在C++中占據(jù)了越來越多的比重性。當(dāng)然,同時(shí)由于Java、C#等語言的出現(xiàn)和硬件價(jià)格的大規(guī)模下降,C++受到了一定的沖擊;第三階段從2000年至今,由于以Loki、MPL等程序庫(kù)為代表的產(chǎn)生式編程和模板元編程

48、的出現(xiàn),C++出現(xiàn)了發(fā)展歷史上又一個(gè)新的高峰,這些新技術(shù)的出現(xiàn)以及和原有技術(shù)的融合,使C++已經(jīng)成為當(dāng)今主流程序設(shè)計(jì)語言中最復(fù)雜的一員。</p><p>  2.4面對(duì)對(duì)象的C++語言類及繼承的特點(diǎn)</p><p>  2.4.1結(jié)構(gòu)體與類以及類的繼承</p><p>  類主要由三個(gè)部分構(gòu)成:類名,數(shù)據(jù)成員和成員函數(shù)。</p><p>&l

49、t;b>  格式如下:</b></p><p><b>  Class 類名</b></p><p><b>  { </b></p><p><b>  Public:</b></p><p><b>  共有數(shù)據(jù)成員;</b><

50、/p><p><b>  共有成員函數(shù);</b></p><p>  Protected:</p><p><b>  保護(hù)數(shù)據(jù)成員;</b></p><p><b>  保護(hù)成員函數(shù);</b></p><p><b>  Private:<

51、/b></p><p><b>  私有數(shù)據(jù)成員;</b></p><p><b>  私有成員函數(shù);</b></p><p><b>  };</b></p><p>  類的聲明有關(guān)鍵字class開始,后面是類名,花括號(hào)中是類體,最后以一個(gè)分號(hào)結(jié)束。</p>

52、;<p> ?、俪绦蛑腥魏卧L問對(duì)象的地方都能夠訪問在成員訪問限定符public。</p><p> ?、谠诔蓡T訪問符private:后面和下一個(gè)成員訪問符之間所有數(shù)據(jù)成員和成員函數(shù)都只能被該類的成員函數(shù)訪問。</p><p> ?、墼趐rotected:之后和下一個(gè)訪問說明符之間的所有數(shù)據(jù)成員和成員函數(shù)稱為類的保護(hù)成員。保護(hù)成員可以被本類的成員函數(shù)訪問,也可以有本類派生類的成

53、員函數(shù)訪問,或被類的友元函數(shù)訪問,而類外的任何其它函數(shù)訪問都是非法的[3]。</p><p>  在C++語言中,結(jié)構(gòu)體中可以包含函數(shù)。在c++中,類和結(jié)構(gòu)體可以通用,結(jié)構(gòu)體也是一種特殊的類,但也有一定的區(qū)別。如果沒有public,類成員不能被外面訪問。用struct結(jié)構(gòu)體定義時(shí),在缺省狀態(tài)下,所有成員都是public,用class類定義時(shí),在缺省狀態(tài)下,所有成員都是private。</p><

54、;p>  表2-1類的繼承訪問特性</p><p> ?、俟欣^承時(shí),基類中的公有成員和保護(hù)成員可被派生類中成員函數(shù)訪問,基類中僅有公有成員才可被派生類的對(duì)象訪問。</p><p> ?、诒Wo(hù)繼承時(shí),將使基類中的公有成員和保護(hù)成員成為派生類的保護(hù)成員;這使得派生類的對(duì)象不能訪問基類中的任何成員,而派生類的成員函數(shù)可以訪問基類中的公有成員和保護(hù)成員。</p><p&

55、gt;  ③私有繼承時(shí),派生類的成員函數(shù)可訪問基類中的公有成員和保護(hù)成員;派生類對(duì)象不能訪問基類的任何成員。</p><p>  2.4.2構(gòu)造函數(shù)與析構(gòu)函數(shù)</p><p>  構(gòu)造函數(shù)是一個(gè)的類的成員函數(shù),主要用于為對(duì)象分配內(nèi)存空間并進(jìn)行初始化,在創(chuàng)建類對(duì)象時(shí)自動(dòng)調(diào)用,除了具有一般成員函數(shù)的特點(diǎn)之外,它還有以下特點(diǎn):</p><p>  ①構(gòu)造函數(shù)最重要的作用是

56、創(chuàng)建對(duì)象本身</p><p>  ②C++規(guī)定,每個(gè)類必須有一個(gè)構(gòu)造函數(shù),沒有構(gòu)造函數(shù),就不能創(chuàng)建任何對(duì)象。</p><p>  ③C++又規(guī)定,如果一個(gè)類沒有提供任何的構(gòu)造函數(shù),則C++提供一個(gè)默認(rèn)的構(gòu)造函數(shù)(由C++編譯器提供),這個(gè)默認(rèn)構(gòu)造函數(shù)是一個(gè)不帶參數(shù)的構(gòu)造函數(shù),它只負(fù)責(zé)創(chuàng)建對(duì)象,而不做任何初始化工作。</p><p> ?、苤灰粋€(gè)類定義了一個(gè)構(gòu)造函數(shù)

57、,不管這個(gè)構(gòu)造函數(shù)是否是帶參數(shù)的構(gòu)造函數(shù),c++就不再提供默認(rèn)的構(gòu)造函數(shù)。也就是說,如果為一個(gè)類定義了一個(gè)帶參數(shù)的構(gòu)造函數(shù),還想要無參數(shù)的構(gòu)造函數(shù),則必須自己定義。</p><p> ?、菔桥c類同名的成員函數(shù),不能指定返回值類型和返回值,可以有任意類型的參數(shù),用于初始化類的數(shù)據(jù)成員。</p><p>  析構(gòu)函數(shù)是類的一個(gè)特殊的成員函數(shù),它執(zhí)行與構(gòu)造函數(shù)相反的操作,通常用于撤銷對(duì)象時(shí)的一些

58、清理任務(wù),它的特點(diǎn)如下:</p><p>  ①?zèng)]有返回值類型和返回值,而且不能重載,在撤銷對(duì)象時(shí),編譯器會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。</p><p>  ②一個(gè)對(duì)象生命周期結(jié)束時(shí),其所占有的內(nèi)存空間就要被收回,這個(gè)工作就有析構(gòu)</p><p><b>  函數(shù)來完成。</b></p><p> ?、畚鰳?gòu)函數(shù)是反向的構(gòu)造函數(shù),析

59、構(gòu)函數(shù)不允許有返回值,更重要是析構(gòu)函數(shù)不允許帶參數(shù),并且一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。</p><p> ?、芪鰳?gòu)函數(shù)與構(gòu)造函數(shù)作用相反,對(duì)象超出其作用范圍,對(duì)應(yīng)的內(nèi)存空間被系統(tǒng)收回或被程序用delete刪除時(shí),析構(gòu)函數(shù)被調(diào)用。</p><p> ?、莞鶕?jù)析構(gòu)函數(shù)這種特點(diǎn),我們可以在構(gòu)造函數(shù)中初始化對(duì)象的某些成員變量,給其分配內(nèi)存空間,在析構(gòu)函數(shù)中釋放對(duì)象運(yùn)行期間所申請(qǐng)的資源。</p&g

60、t;<p>  2.4.3類中函數(shù)覆蓋的問題</p><p>  函數(shù)的覆蓋發(fā)生在父類與子類之間。當(dāng)父類與子類有同一特性函數(shù),但子類稍有區(qū)別,而且子類此函數(shù)沒有特殊聲明,就可能發(fā)生子類特性被父類覆蓋。</p><p>  如果派生類需要對(duì)繼承的成員函數(shù)重新定義功能而非覆蓋該函數(shù),則該函數(shù)在基類中應(yīng)該定義為虛函數(shù),通過在成員函數(shù)名前面加virtual實(shí)現(xiàn),這樣,當(dāng)通過基類指針調(diào)

61、用該成員函數(shù)時(shí),c++能自動(dòng)判斷調(diào)用哪一個(gè)類的成員函數(shù)。</p><p>  一句話:在基類函數(shù)前面加上virtual,如果說子類有的函數(shù),調(diào)用子類的,子類沒有的,調(diào)用父類的。</p><p>  第三章 開發(fā)技術(shù)介紹及圖像存儲(chǔ)格式</p><p>  3.1 Direct Show技術(shù)簡(jiǎn)介</p><p>  3.1.1 Direct Sh

62、ow簡(jiǎn)介</p><p>  Direct Show是DirectX家族成員中為在Windows平臺(tái)上處理各種格式的多媒體文件的回放、音視頻采集等高性能要求的多媒體應(yīng)用提供了完整的解決方案;DirectShow集成了DirectX家族中其他成員(如DirectDraw、DirectSound等)的技術(shù),為我們的多媒體應(yīng)用提供了一下的方便:</p><p> ?、俦WC了數(shù)據(jù)量巨大的多媒體應(yīng)用

63、數(shù)據(jù)處理的高效性。</p><p>  ②解決了音頻和視頻時(shí)刻保持同步。</p><p> ?、塾米詈?jiǎn)單的方法處理復(fù)雜的多媒體源問題,包括本地文件、計(jì)算機(jī)網(wǎng)絡(luò)、廣播電視以及其他一些數(shù)碼產(chǎn)品等。</p><p> ?、芴峁┝私鉀Q處理各種多媒體格式文件的方法。</p><p> ?、葜С帜繕?biāo)系統(tǒng)中不可預(yù)知的硬件變動(dòng)。</p><

64、;p>  Direct Show使應(yīng)用程序開發(fā)人員從復(fù)雜的數(shù)據(jù)傳輸、硬件差異、同步性等工作解脫出來,總體應(yīng)用框架和底層工作由Direct Show來完成[5]。</p><p>  3.1.2 Direct Show系統(tǒng)</p><p>  圖3-1 Direct Show系統(tǒng)</p><p>  如圖3-1所示,圖中央最大的一塊即是Direct Show系統(tǒng)

65、,虛線以下是Ring 0特權(quán)級(jí)別的硬件設(shè)備,虛線以上的是Ring 3特權(quán)級(jí)別的應(yīng)用層。Direct Show系統(tǒng)位于應(yīng)用層中。它使用一種叫Filter Graph的模型來管理整個(gè)數(shù)據(jù)流的處理過程;參與數(shù)據(jù)處理的各個(gè)功能模塊稱為Filter;各個(gè)Filter在Filter Graph中按一定的順序連接成一條“流水線”協(xié)同工作。</p><p><b>  ①Filter</b></p&g

66、t;<p>  Filter是Direct Show中最基本的概念,是Filter Graph中最小的功能模塊,F(xiàn)ilter是一種COM組件,一個(gè)Filter一般由一個(gè)或多個(gè)Pin組成,F(xiàn)ilter之間也就通過Pin相互連接,構(gòu)成一條順序的鏈路。按照功能來分:Filter大致分為3類:Source Filters、Transform Filters和Rendering Filters。Source Filters主要負(fù)責(zé)獲

67、取數(shù)據(jù),數(shù)據(jù)源可以是文件、因特網(wǎng)計(jì)算機(jī)里的采集卡(WDM驅(qū)動(dòng)的或VFW驅(qū)動(dòng)的)數(shù)字?jǐn)z像機(jī)等,然后將數(shù)據(jù)往下傳輸;Transform Filters主要負(fù)責(zé)數(shù)據(jù)的格式轉(zhuǎn)換,例如數(shù)據(jù)流的分離/合成、解碼/編碼等,然后將數(shù)據(jù)繼續(xù)往下傳輸;Rendering Filters主要負(fù)責(zé)數(shù)據(jù)的最終去向——將數(shù)據(jù)送給顯卡、聲卡進(jìn)行多媒體的播放,或者輸出到文件進(jìn)行存儲(chǔ)。</p><p>  每一個(gè)filter都與其他一個(gè)或幾個(gè)fi

68、lter相連,連接點(diǎn)也是COM對(duì)象,我們稱為pin,F(xiàn)ilter通過pin從一個(gè)filter傳到另一個(gè)filter,從而可以使數(shù)據(jù)在filter鏈表中流動(dòng),在direct show我們稱filter鏈表為filter Graph。</p><p>  ②源過濾器(source filter):源過濾器引入數(shù)據(jù)到過濾器圖表中,數(shù)據(jù)來源可以是文件、網(wǎng)絡(luò)、照相機(jī)等。不同的源過濾器處理不同類型的數(shù)據(jù)源。 </p&g

69、t;<p> ?、圩儞Q過濾器(transform filter):變換過濾器的工作是獲取輸入流,處理數(shù)據(jù),并生成輸出流。變換過濾器對(duì)數(shù)據(jù)的處理包括編解碼、格式轉(zhuǎn)換、壓縮解壓縮等。 </p><p> ?、芴峤贿^濾器(renderer filter):提交過濾器在過濾器圖表里處于最后一級(jí),它們接收數(shù)據(jù)并把數(shù)據(jù)提交給外設(shè)。</p><p><b> ?、軼DM采集設(shè)備

70、</b></p><p>  Windows驅(qū)動(dòng)程序模型(Window Driver Model,WDM)是Windows 98和Windows 2000使用的新的驅(qū)動(dòng)程序設(shè)計(jì)規(guī)范。使用WDM使得硬件驅(qū)動(dòng)程序更加穩(wěn)定,讓操作系統(tǒng)對(duì)硬件更加有效地控制硬件。除了定義一個(gè)驅(qū)動(dòng)程序與操作系統(tǒng)連接的標(biāo)準(zhǔn)接口以外,WDM也指明了驅(qū)動(dòng)程序應(yīng)該采用的更加模塊化的設(shè)計(jì)。</p><p>  基本

71、上,WDM規(guī)范依靠一個(gè)標(biāo)準(zhǔn)化的類驅(qū)動(dòng)程序來控制一類硬件的最常用和基本的功能。Windows 2000為每一類硬件包括一個(gè)本地類驅(qū)動(dòng)程序,然后,對(duì)應(yīng)于某個(gè)特定廠商或者硬件型號(hào)的迷你驅(qū)動(dòng)程序加入在類驅(qū)動(dòng)中未包括的特殊或定制功能。廠商還可以更進(jìn)一步地加入過濾器驅(qū)動(dòng)程序來提供在類驅(qū)動(dòng)的上層或底層進(jìn)行的微調(diào)特性,以此來提供驅(qū)動(dòng)程序本身和由硬件設(shè)備執(zhí)行的任務(wù)最大的效率。在絕大多數(shù)情況下,這種設(shè)計(jì)將得到各方面均兼容于Windows 2000的驅(qū)動(dòng)程序

72、,提供更好的性能,消耗更少的系統(tǒng)資源,并且對(duì)驅(qū)動(dòng)程序大小的縮減經(jīng)常達(dá)到90%。注意此處大小指的只是廠商/型號(hào)特定驅(qū)動(dòng)程序,而不包括本地類驅(qū)動(dòng)程序。</p><p>  在Windows 2000中包括WDM不但擴(kuò)展了支持設(shè)備的數(shù)量,也給微軟的主要網(wǎng)絡(luò)操作系統(tǒng)帶來了即插即用能力。盡管Windows 2000并不能支持市面上所有的硬件,它的硬件兼容性列表(Hardware Compatibility list,HCL

73、)已經(jīng)遠(yuǎn)遠(yuǎn)大于Windows NT 4.0的系統(tǒng)的工作機(jī)制。</p><p>  事件通知機(jī)制:當(dāng)某個(gè)事件發(fā)生時(shí),比如數(shù)據(jù)流結(jié)束,產(chǎn)生一個(gè)錯(cuò)誤等,F(xiàn)ilter就給 Filter圖表管理器發(fā)送一個(gè)事件通知。Filter圖表管理器處理其中的一部分事件,另一部分交給應(yīng)用程序處理。如果圖表管理器沒有處理一個(gè) filter事件,它就把事件通知放入到一個(gè)隊(duì)列中,圖表管理器也可以將自己的事件通知放進(jìn)隊(duì)列中。 應(yīng)用程序可以自己處

74、理隊(duì)列中的事件,dshow 中的事件通知就和 windows 的消息機(jī)制差不多,filter,圖表管理器和應(yīng)用程序通過這種機(jī)制就可以互相通信。</p><p>  Filter都是通過調(diào)用圖表管理器的IMediaEventSink::Notify方法來通知圖表管理器某種事件發(fā)生。事件通知包括一個(gè)事件code,這個(gè)code不僅僅代表了事件的類型,還包含兩個(gè)DWORD類型的參數(shù)用來傳遞一些其他的信息。關(guān)于事件code

75、的內(nèi)容,在下面的一個(gè)專題中列出,這里暫略,使用時(shí)可以參考幫助。應(yīng)用程序通過調(diào)用圖表管理器的IMediaEvent::GetEvent方法來從事件隊(duì)列中獲取事件。如果有事件發(fā)生,該函數(shù)就返回一個(gè)事件碼和兩個(gè)參數(shù),如果沒有事件,則一直阻塞直到有事件發(fā)生和超過某個(gè)時(shí)間。</p><p>  3.2 Direct Show的下載安裝</p><p>  通過此網(wǎng)站http://www.direct

76、show.cn/SDK/DX9SDK.rar下載到壓縮版Direct Show,解壓到文件夾,安裝,這幾步都比較簡(jiǎn)單,重點(diǎn)是如何配置到vc環(huán)境中。</p><p><b>  具體步驟如下:</b></p><p> ?。?)使用VC向?qū)梢粋€(gè)具體項(xiàng)目,如Win32 Dynamic-Link。</p><p>  (2)包含頭文件stream

77、s.h。</p><p> ?。?) 在VC的菜單中選擇Project|Settings|C/C++,在彈出的對(duì)話框中的Category中選擇Code generation,然后在Calling convention中選擇_stdcall。</p><p>  圖3-2 direct show的安裝</p><p> ?。?)使用多線程語言運(yùn)行時(shí)庫(kù),即在VC的菜單中

78、選擇Project|Settings|C/C++,在彈出的對(duì)話框中的Category中選擇Code generation,然后在Use run-time library中,Debug版選擇Debug Multithreaded,Release版選擇Multithreaded。</p><p>  圖3-3 direct show的安裝</p><p> ?。?) 配置必要的鏈接庫(kù)文件,即在

79、VC的菜單中選擇Project|Settings|Link,在彈出的對(duì)話框中的Category中選擇General,然后在Object/library modules中輸入如下代碼:Debug版本 strmbasd.lib, msvcrtd.lib, winmm.lib,并且選中Ignore all default libraries。DirectShow SDK建議,DirectShow應(yīng)用程序應(yīng)該至少連接庫(kù)文件strmiids.li

80、b和quartz.lib。前者定義了DirectShow標(biāo)準(zhǔn)的CLSID和IID,后者定義了導(dǎo)出函數(shù)AMGetErrorText(如果應(yīng)用程序中沒有使用到這個(gè)函數(shù),也可以不連接這個(gè)庫(kù))。如果程序里包含了頭文件streams.h,則一般庫(kù)文件還要連接strmbasd.lib、uuid.lib、winmm.lib。</p><p> ?。?)將DirectX SDK的Include和Lib目錄配置到VC的系統(tǒng)目錄中去

81、,并且放在標(biāo)準(zhǔn)的VC目錄之前,以保證編譯器能夠拿到最新版本的源文件。選擇Tools|Options|Directories,在彈出的對(duì)話框中的Show directories for中選擇Include files,配置如下(假設(shè)DirectX SDK安裝在D:\DXSDK目錄下,VC安裝在C:\Program Files下):</p><p>  D:\DXSDK\Include</p><

82、p>  D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES</p><p>  D:\DXSDK\SAMPLES\C++\COMMON\INCLUDE</p><p>  C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE</p><p>  C:\Program Fi

83、les\Microsoft Visual Studio\VC98\MFC\INCLUDE</p><p>  C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE</p><p>  再在Show directories for中選擇Library files,配置如下:</p><p>  D:\DXS

84、DK\Lib</p><p>  D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\DEBUG</p><p>  D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\RELEASE</p><p>  C:\PROGRAM FILES\MICROSOFT SDK\LIB</p>

85、<p>  C:\Program Files\Microsoft Visual Studio\VC98\LIB</p><p>  C:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB</p><p>  (7)因?yàn)镈irectShow應(yīng)用程序是一種COM客戶程序,因此在調(diào)用任何COM函數(shù)之前調(diào)用CoInitialize()

86、(或CoInitializeEx)函數(shù)進(jìn)行COM庫(kù)的初始化(一般是在應(yīng)用程序啟動(dòng)的時(shí)候調(diào)用一次),在結(jié)束COM庫(kù)使用時(shí)調(diào)用CoUninitialize()函數(shù)進(jìn)行反初始化(一般是在應(yīng)用程序退出前調(diào)用一次)。</p><p>  配置時(shí),應(yīng)該注意的問題如下:</p><p> ?、賗nclude和lib的路徑前后順序一定要“非常嚴(yán)格按照上面順序排列”,否則 DXSDK\Include和V

87、C98\INCLUDE有頭文件名是重名的,例如control.h,strmif.h。所以要優(yōu)先選擇DXSDK的文件聲明。DXSDK\Lib和VC98\LIB對(duì) DWORD_PTR 這個(gè)數(shù)據(jù)類型的聲明順序出現(xiàn)編譯上連接的歧異。</p><p>  ②BASECLASSES\DEBUG和BASECLASSES\RELEASE目錄和目錄里面是內(nèi)容是沒有的,如果你在應(yīng)用程序中使用了BASECLASSES里面的class,

88、function,filter,interface,就要先用VC編譯baseclasses.dsw,編譯時(shí)請(qǐng)分別選定DEBUG和RELEASE,因?yàn)閎aseclasses.dsw有4個(gè)版本,而且默認(rèn)下都不是DEBUG和RELEASE。編譯后生成兩個(gè)重要文件:strmbasd.lib(Debug),STRMBASE.lib(Release),在以后將用到。</p><p>  3.3使用VMR技術(shù)實(shí)現(xiàn)視頻圖像捕獲&

89、lt;/p><p>  3.3.1 VMR技術(shù)基礎(chǔ)</p><p>  顯示圖像時(shí)使用的是Video Renderer視頻渲染技術(shù),可應(yīng)用于所有支持DirectX的平臺(tái),是視頻顯示較早的技術(shù)應(yīng)用,對(duì)平臺(tái)沒有特殊要求;在Windows XP操作系統(tǒng)之前是默認(rèn)的顯示技術(shù)[6]。</p><p>  視頻混合渲染Video Mixing Renderer 7(VMR-7)可用

90、于WindowsXP操作系統(tǒng),且是該系統(tǒng)的默認(rèn)選擇,與舊的顯示濾波器相比功能有大的提升。VMR-9是DirectShow SDK 9.0中的視頻渲染技術(shù),采用Direct3D技術(shù)。VMR-9不是默認(rèn)選擇的濾波器,對(duì)系統(tǒng)要求更高,但功能更強(qiáng)、效果更好,它使用了最新的圖像API函數(shù)提供了最好的顯示性能。</p><p>  視頻顯示根據(jù)有無窗口可分為有窗口模式和無窗口模式。Video Renderer只支持窗口模式,

91、VMR支持有窗口(Window)和無窗口(Windowless)兩種模式,默認(rèn)支持有窗口模式。在無窗口模式中,可以把視頻和應(yīng)用程序主界面的窗口捆綁。</p><p><b> ?、偈褂脽o窗口模式</b></p><p>  dshow 的視頻提交過濾器可以在窗口模式和無窗口模式下工作。在窗口模式下,過濾器創(chuàng)建一個(gè)自己的窗口,在里面播放視頻。在無窗口模式下,過濾器直接將

92、視頻在應(yīng)用程序提供的窗口上顯示,過濾器本身不創(chuàng)建窗口。 </p><p><b> ?、诖翱谀J?</b></p><p>  在窗口模式下,視頻提交過濾器創(chuàng)建一個(gè)窗口,然后將視頻禎帖到窗口上,你可以將這個(gè)窗口帖到你的應(yīng)用程序的窗口。</p><p>  VMR在清晰、流暢顯示視頻的同時(shí),可以靈活地捕獲圖像幀,這也是我們選擇VMR技術(shù)的一個(gè)重要

93、原因,因?yàn)槲覀兿胫苯訉?duì)圖像數(shù)據(jù)進(jìn)行處理。</p><p>  3.3.2視頻圖像捕獲類CVMR_Capture的實(shí)現(xiàn)</p><p>  為完成采集視頻、預(yù)覽視頻和捕獲圖像幀的任務(wù),我們封裝了CVMR_Capture類,使用VMR技術(shù)流暢顯示和捕捉圖像幀。根據(jù)GraphEdit的濾波器內(nèi)容和鏈表的操作,編程實(shí)現(xiàn)使用VMR技術(shù)顯示、捕捉圖像。</p><p>  系統(tǒng)

94、設(shè)備枚舉器為我們按類型枚舉已注冊(cè)在系統(tǒng)中的Fitler提供了統(tǒng)一的方法。而且它能夠區(qū)分不同的硬件設(shè)備,即便是同一個(gè)Filter支持它們。這對(duì)那些使用Windows驅(qū)動(dòng)模型和KSProxy Filter的設(shè)備來說是非常有用的。系統(tǒng)設(shè)備枚舉器對(duì)它們按不同的設(shè)備實(shí)例進(jìn)行對(duì)待。</p><p>  當(dāng)我們利用系統(tǒng)設(shè)備枚舉器查詢?cè)O(shè)備的時(shí)候,系統(tǒng)設(shè)備枚舉器為特定類型的設(shè)備(如,音頻捕獲和視頻壓縮)生成了一張枚舉表(Enume

95、rator)。類型枚舉器(Category enumerator)為每個(gè)這種類型的設(shè)備返回一個(gè)Moniker,類型枚舉器自動(dòng)把每一種即插即用的設(shè)備包含在內(nèi)。</p><p><b>  步驟如下:</b></p><p> ?、僬{(diào)用方法CoCreateInstance生成系統(tǒng)設(shè)備枚舉器。類標(biāo)識(shí)(CLSID)為CLSID_SystemDeviceEnum。</p&

96、gt;<p> ?、谡{(diào)用ICreateDevEnum::CreateClassEnumerator方法生成類型枚舉器,參數(shù)為你想要得到的類型的CLSID,該方法返回一個(gè)IEnumMoniker接口指針,如果指定的類型(是空的)或不存在,函數(shù)ICreateDevEnum::CreateClassEnumerator將返回S_FALSE而不是錯(cuò)誤代碼,同時(shí)IEnumMoniker指針(譯注:通過參數(shù)返回)也是空的,這就要求我們

97、在調(diào)用CreateClassEnumerator的時(shí)候明確用S_OK進(jìn)行比較而不是使用宏SUCCEEDED。</p><p> ?、凼褂肐EnumMoniker::Next方法依次得到IEnumMoniker指針中的每個(gè)moniker。該方法返回一個(gè)IMoniker接口指針。當(dāng)Next到達(dá)枚舉的底部,它的返回值仍然是S_FALSE,這里我們?nèi)孕枰肧_OK來進(jìn)行檢驗(yàn)。</p><p>  

98、④想要得到該設(shè)備較為友好的名稱,調(diào)用IMoniker::BindToStorage方法。</p><p> ?、萑绻胍刹⒊跏蓟芾碓撛O(shè)備的Filter調(diào)用3返回指針的IMonitor::BindToObject方法,接下來調(diào)用IFilterGraph::AddFilter把該Filter添加到視圖中[8]。</p><p>  使用VMR-9技術(shù)實(shí)現(xiàn)視頻的采集、存儲(chǔ)任務(wù)的程序。首先如

99、果再次調(diào)用該函數(shù),則關(guān)閉所有接口、釋放有關(guān)資源;接著創(chuàng)建IGraphBuilder作為濾波器鏈表管理器;然后添加VMR濾波器到鏈表中,把指定的采集設(shè)備索引與捕獲濾波器捆綁,并把該濾波器添加到鏈表中;接著獲取捕獲濾波器的引腳、獲取媒體控制接口和事件接口;設(shè)置窗口通知消息處理,根據(jù)輸入的視頻分辨率匹配采集設(shè)備的分辨率;最后使用自動(dòng)渲染功能Render方法把濾波器鏈表鏈接起來,使用媒體控制接口的方法Run開始運(yùn)行媒體。</p>

100、<p>  首先使用CoCreateInstance創(chuàng)建VMR的接口pVmr,然后把VMR濾波器添加到濾波器鏈表中。設(shè)置視頻顯示為無窗口模式,首先在pVmr接口下查詢IVMRFilterConfig接口,以參數(shù)VMRMode_Windowless使用SetRenderingMode方法設(shè)置完成。最后設(shè)置傳入的窗口為視頻剪輯窗口。</p><p>  當(dāng)采用無窗口的模式時(shí),就沒有必要暴露IVideoWin

101、dow接口了。為了能夠使用VMR的缺省行為,在構(gòu)建Graph圖之前必須要調(diào)整VMR。</p><p> ?、賱?chuàng)建一個(gè)過慮器圖表管理器。</p><p>  ②創(chuàng)建一個(gè)VMR,加入到graph中。</p><p> ?、壅{(diào)用VMR的IVMRFilterConfig::SetRenderingMode方法設(shè)置VMRMode_Windowless標(biāo)志。</p>

102、<p> ?、苷{(diào)用IVMRWindowlessControl::SetVideoClippingWindow給視頻指定一個(gè)顯示窗口。</p><p>  3.4BMP格式介紹</p><p><b>  3.4.1簡(jiǎn)介</b></p><p>  BMP是英文Bitmap(位圖)的簡(jiǎn)寫,它是Windows操作系統(tǒng)中的標(biāo)準(zhǔn)圖像文件格

103、式,能夠被多種Windows應(yīng)用程序所支持。隨著Windows操作系統(tǒng)的流行與豐富的Windows應(yīng)用程序的開發(fā),BMP位圖格式理所當(dāng)然地被廣泛應(yīng)用。這種格式的特點(diǎn)是包含的圖像信息較豐富,幾乎不進(jìn)行壓縮,但由此導(dǎo)致了它與生俱生來的缺點(diǎn)--占用磁盤空間過大。</p><p>  BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,在Windows環(huán)境下運(yùn)行的所有圖象處理軟件都支持BMP圖象文

104、件格式。Windows系統(tǒng)內(nèi)部各圖像繪制操作都是以BMP為基礎(chǔ)的。Windows 3.0以前的BMP圖文件格式與顯示設(shè)備有關(guān),因此把這種BMP圖象文件格式稱為設(shè)備相關(guān)位圖DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP圖象文件與顯示設(shè)備無關(guān),因此把這種BMP圖象文件格式稱為設(shè)備無關(guān)位圖DIB(device-independent bitmap)格式目的是為了讓W(xué)indows能夠在任何類

105、型的顯示設(shè)備上顯示所存儲(chǔ)的圖象。BMP位圖文件默認(rèn)的文件擴(kuò)展名是BMP或者bmp[9]。</p><p><b>  3.4.2文件結(jié)構(gòu)</b></p><p>  位圖文件可看成由4個(gè)部分組成:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節(jié)陣列。&

106、lt;/p><p>  位圖文件頭 (bitmap-file header) BITMAPFILEHEADER bmfh</p><p>  位圖信息頭 (bitmap-information header) BITMAPINFOHEADER bmih </p><p>  彩色表 (color table) RGBQUAD aColors[] </p>

107、<p>  圖象數(shù)據(jù)陣列字節(jié) BYTE aBitmapBits[]</p><p>  表3-1 BMP的文件頭</p><p>  位圖文件頭包含有關(guān)于文件類型、文件大小、存放位置等信息,在Windows 3.0以上版本的位圖文件中用BITMAPFILEHEADER結(jié)構(gòu)來定義: </p><p>  typedef struct tagBITMAPFIL

108、EHEADER { /* bmfh */ </p><p>  UINT bfType; </p><p>  DWORD bfSize; </p><p>  UINT bfReserved1; </p><p>  UINT bfReserved2; </p><p>  DWORD bfOffBits; <

109、/p><p>  } BITMAPFILEHEADER; </p><p><b>  其中: </b></p><p><b>  bfType </b></p><p><b>  說明文件的類型. </b></p><p><b>  bfS

110、ize </b></p><p>  說明文件的大小,用字節(jié)為單位 </p><p>  bfReserved1 </p><p>  保留,必須設(shè)置為0 </p><p>  bfReserved2 </p><p>  保留,必須設(shè)置為0 </p><p>  bfOffBits

溫馨提示

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

評(píng)論

0/150

提交評(píng)論