《軟件工程實(shí)踐》項(xiàng)目總結(jié)報(bào)告圖像簡單處理系統(tǒng)
《《軟件工程實(shí)踐》項(xiàng)目總結(jié)報(bào)告圖像簡單處理系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《《軟件工程實(shí)踐》項(xiàng)目總結(jié)報(bào)告圖像簡單處理系統(tǒng)(48頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 《軟件工程實(shí)踐》項(xiàng)目總結(jié)報(bào)告 (2010/2011學(xué)年 第1學(xué)期) 項(xiàng)目名稱:圖像簡單處理系統(tǒng) 班 級(jí):軟件0801 項(xiàng)目成員: 2022年4月 《軟件工程實(shí)踐》項(xiàng)目總結(jié)報(bào)告 項(xiàng)目評(píng)分 歷次項(xiàng)目階段性評(píng)審得分 第1次 第2次 第3次 第4次 第5次 第6次 最終名次 2 2 2 2 1 1 2 項(xiàng)目成員對(duì)項(xiàng)目貢獻(xiàn)比例(%) 黃超 趙劍華 孫芳芳 謝彩燕 胡華東 施盛楠 19% 19% 14% 16% 18% 14% 項(xiàng)目自我評(píng)價(jià)與心得體會(huì) 黃超: 在本次項(xiàng)
2、目的開發(fā)過程中,我主要擔(dān)任了項(xiàng)目組長的職務(wù)。在對(duì)項(xiàng)目進(jìn)行管理方面進(jìn)了自己最大的能力與心力去做了,但還是存在很多不足的。通過這次開發(fā),我第一次感受到了開發(fā)一個(gè)項(xiàng)目的不容易。首先是在項(xiàng)目成員的管理上,由于人員較多,項(xiàng)目不同于其他的基于WEB的項(xiàng)目,在任務(wù)分配后各小組進(jìn)度不同,很難進(jìn)行系統(tǒng)的集成。所以在項(xiàng)目后期集成方面遇到了很多問題。同時(shí)通過這次項(xiàng)目開發(fā)也令我懂得了更多關(guān)于團(tuán)隊(duì)之間的協(xié)作的重要性。 孫芳芳: 我們項(xiàng)目起初是作為創(chuàng)新項(xiàng)目在開發(fā)軟件,所以我們?cè)谑罴俚臅r(shí)候就有在學(xué)習(xí)和開發(fā),起步相對(duì)其他小組比較早,但是雖然如此,由于在后階段并沒有像起初一樣的積極性,在后面開發(fā)的內(nèi)容并不多,導(dǎo)致最
3、后趕得特別不易,這是我覺得下次開發(fā)需要改進(jìn)的地方。我也從本次實(shí)踐課中學(xué)到了很多東西,比方說團(tuán)隊(duì)合作與溝通,比方多新知識(shí)的學(xué)習(xí)等等。 趙劍華: 在一個(gè)學(xué)期的實(shí)踐中,不僅加強(qiáng)了編碼能力,同時(shí)也加強(qiáng)了溝通交流能力,另外還鍛煉了演講能力。面對(duì)軟件的不斷重構(gòu)以及軟件功能不斷更新,完善,在鍛煉編碼能力的同時(shí)還加強(qiáng)了代碼的管理能力,使我的編碼風(fēng)格有很大的改進(jìn)。在編碼完成自己部分功能的同時(shí)不斷與團(tuán)隊(duì)隊(duì)員之間的溝通,并且不斷地了解,使我明白要怎么樣更好的與團(tuán)隊(duì)之間進(jìn)行溝通,以及怎么去處理隊(duì)員與隊(duì)員之間的問題。這個(gè)學(xué)期里,為了軟件付出了挺多,當(dāng)然得到了也很多。最主要的不是有多辛酸辛苦,而且能力得到
4、了,這個(gè)是最主要的,是生活中最需 要的。在此感謝軟件工程實(shí)踐為我?guī)淼囊磺小? 施盛楠: 軟件工程實(shí)踐中我們已做了一學(xué)期圖形圖像的項(xiàng)目,但是并不成功,下學(xué)期要放棄做別的項(xiàng)目,我心里還是比較不痛快的。但是技術(shù)存在難題,這讓大家有點(diǎn)徒嘆奈何的感慨。第一次和團(tuán)隊(duì)做項(xiàng)目,大家都是第一次,對(duì)于項(xiàng)目的具體流程雖然有老師的指導(dǎo),但是配合上還是出現(xiàn)了很多問題。我感覺我們小組并沒出現(xiàn)什么化學(xué)反應(yīng),大家都不溫不火的在做,一開始興趣還比較大,但是后來就有點(diǎn)泄氣了??墒亲鲕浖?xiàng)目并不是個(gè)憑興趣的事情,這是需要大家負(fù)擔(dān)自己責(zé)任的。或許就像老師說的,我們肩上的壓力不夠大吧,人有時(shí)候就是要逼自己才好。 胡華東:
5、 在此次項(xiàng)目開發(fā)過程中,不僅鍛煉了自己的代碼編程能力,文檔編寫能力,加強(qiáng)了小組成員之間的溝通能力,而且改善了編碼風(fēng)格。在編碼完成自己部分功能的同時(shí)不斷與團(tuán)隊(duì)隊(duì)員之間的溝通,并且不斷地了解,使我明白要怎么樣更好的與團(tuán)隊(duì)之間進(jìn)行溝通,以及怎么去處理隊(duì)員與隊(duì)員之間的問題。這個(gè)學(xué)期里,為了軟件付出了挺多,當(dāng)然得到了也很多。最主要的不是有多辛酸辛苦,而且能力得到了,這個(gè)是最主要的,是生活中最需 要的。在此感謝軟件工程實(shí)踐為我?guī)淼囊磺小? 教師評(píng)分 ¨優(yōu) ¨良 ¨中 ¨及格 ¨不及格 - 45 - 目 錄 1項(xiàng)目概況 2
6、 1.1團(tuán)隊(duì)組成 2 1.2開發(fā)環(huán)境 2 1.3需求概述 2 1.3.1項(xiàng)目背景 3 1.3.2現(xiàn)狀分析 3 1.3.3項(xiàng)目意義 3 1.3.4適用范圍 4 2需求說明 4 2.1分割功能: 4 2.2合成功能: 5 2.3修復(fù)功能: 5 3架構(gòu)設(shè)計(jì) 6 3.1功能設(shè)計(jì) 6 3.2概要設(shè)計(jì) 6 3.2.1分割功能 6 3.3合成功能: 9 3.4修補(bǔ)實(shí)現(xiàn): 10 4迭代日志 12 4.1界面迭代: 12 4.2分割迭代: 17 4.3合成迭代: 18 4.4修補(bǔ)迭代: 19 5分工情況 21 6FAQ 22 6.1環(huán)境配置: 22 6.2代碼編
7、寫: 30 6.3項(xiàng)目管理: 41 6.3.1人員管理 41 6.3.2時(shí)間安排 41 6.3.3小組溝通問題 42 6.3.4小組進(jìn)度緩慢 42 6.4其他問題: 42 6.5 FAQ的數(shù)量統(tǒng)計(jì)表 42 1項(xiàng)目概況 1.1團(tuán)隊(duì)組成 本項(xiàng)目一共由6人組成,其中根據(jù)軟件功能又分為4個(gè)小組,分別為界面設(shè)計(jì)小組:趙劍華;圖像分割小組:黃超、孫芳芳;圖像合成小組:XXX、XX;圖像修復(fù)小組:XXX、XXX。組長由XXX擔(dān)任。 1.2開發(fā)環(huán)境 本項(xiàng)目開發(fā)工具主要使用了Microsoft Visual Studio.NET 2003,同時(shí)還使用了OpenCV 1.0的類庫,所使
8、用的操作系統(tǒng)為Windows XP。 1.3需求概述 1.3.1項(xiàng)目背景 隨著計(jì)算機(jī)科學(xué)的飛速發(fā)展,虛擬現(xiàn)實(shí)技術(shù)已滲透進(jìn)入了軍事、工程、醫(yī)學(xué)、教育等各個(gè)方面, 并且在這些領(lǐng)域中起著重要的作用。如海灣戰(zhàn)爭的美國士兵對(duì)周邊的環(huán)境不覺得陌生,是由于虛擬現(xiàn)實(shí)已把他們帶入那漫無邊際的風(fēng)塵黃沙,讓他們“身臨其境”感受到大漠的荒涼。 虛擬現(xiàn)實(shí)技術(shù)是一種可以創(chuàng)建和體驗(yàn)虛擬世界的計(jì)算機(jī)仿真系統(tǒng),它利用計(jì)算機(jī)生成一種模擬環(huán)境,是一種多源信息融合的交互式的三維動(dòng)態(tài)視景和實(shí)體行為的系統(tǒng)仿真,使用戶沉浸到該環(huán)境中去。虛擬現(xiàn)實(shí)技術(shù)是仿真技術(shù)的一個(gè)重要方向,是仿真技術(shù)與計(jì)算機(jī)圖形學(xué)、人機(jī)接口技術(shù)、多媒體技術(shù)、傳
9、感技術(shù)、網(wǎng)絡(luò)技術(shù)等多種技術(shù)的集合,是一門富有挑戰(zhàn)性的交叉技術(shù)、前沿學(xué)科和研究領(lǐng)域。美國對(duì)此的投資從80年代的幾千美金到現(xiàn)在14個(gè)億足以說明其重要性。 1.3.2現(xiàn)狀分析 近年來,計(jì)算機(jī)圖像技術(shù)的飛速發(fā)展和應(yīng)用使個(gè)人電腦上的美術(shù)創(chuàng)作進(jìn)入一個(gè)新的階段,各種圖像處理軟件也越來越完善,普及程度不斷地提高。其中的圖像處理軟件Photoshop是目前公認(rèn)的較好用的通用美術(shù)設(shè)計(jì)軟件。它包括的功能有:可以對(duì)圖像進(jìn)行修飾、對(duì)圖形進(jìn)行編輯、對(duì)圖像的色彩進(jìn)行處理等。在實(shí)際生活中人們通常將數(shù)碼相機(jī)拍攝下來的照片利用圖像處理軟件來進(jìn)行編輯和修飾,現(xiàn)在越來越多的用戶不僅僅是滿足與單純的圖像處理,更希望利用圖像處理
10、軟件來進(jìn)行高質(zhì)量的廣告設(shè)計(jì)、美術(shù)創(chuàng)意和三維動(dòng)畫。 利用圖像處理軟件制作圖形,要生產(chǎn)一個(gè)好的作品包括三個(gè)方面的內(nèi)容:創(chuàng)意、構(gòu)圖能力、計(jì)算機(jī)表達(dá)。即首先要有好的創(chuàng)意,然后對(duì)其進(jìn)行粗略構(gòu)圖,然后借助計(jì)算機(jī)手段,制作出所構(gòu)想的最終效果圖。由于圖像處理軟件的功能強(qiáng)大,目前正被越來越多的圖像編排、廣告和形象設(shè)計(jì)以及婚紗影樓等領(lǐng)域廣泛使用,是非常受歡迎的軟件類別。 1.3.3項(xiàng)目意義 本項(xiàng)目擬研究以對(duì)象分割、圖像修復(fù)和圖像合成為核心的基于圖像的編輯與繪制技術(shù),并基于此開發(fā)一個(gè)虛擬現(xiàn)實(shí)場(chǎng)景圖像的特效制作軟件系統(tǒng)。首先,研究基于筆刷的對(duì)象分割算法,實(shí)現(xiàn)少量交互輔助下的便捷景物提?。淮思夹g(shù)可用于圖像的切割,
11、切割下的圖像可以黏貼至其他圖像,可用于合成新的場(chǎng)景和圖像。利用該項(xiàng)技術(shù)人們可以對(duì)自己喜歡的場(chǎng)景方便的進(jìn)行截取,進(jìn)行圖像處理更加方便。然后,研究圖像的修復(fù)和拼接算法,實(shí)現(xiàn)景物移除后所遺留的空白區(qū)域的自動(dòng)填補(bǔ);使得新的圖像看不出剪裁過的痕跡且沒有裂縫。利用該技術(shù)可以使原有圖像在切割掉的基礎(chǔ)上依然保持圖像的完整性和連續(xù)性。 最后,研究圖像的融合和合成算法,實(shí)現(xiàn)克隆景物與已有場(chǎng)景的無縫合成。通過這個(gè)系統(tǒng),我們可以方便地移除圖像中不需要的景物、添加進(jìn)原來沒有的景物或者重新編排圖像中已有景物的位置,制作和生成新的虛擬現(xiàn)實(shí)場(chǎng)景圖像。此系統(tǒng)在現(xiàn)實(shí)生活中也有很廣泛的應(yīng)用,例如,對(duì)于舊照片的修復(fù),照片的合成以及
12、制作電影特效等。同時(shí)還可以給人帶來很好的娛樂效果,人們可以利用系統(tǒng)制作自己喜歡的圖像,合成搞笑的圖像等。本項(xiàng)目的開發(fā)從娛樂和實(shí)用的角度都具有很重要的意義。 1.3.4適用范圍 本軟件適合于對(duì)各種格式的數(shù)字圖像進(jìn)行處理。 2需求說明 界面功能主要有打開,保存,視圖等基本功能,并且對(duì)功能分割,修補(bǔ),合成功能的接口處理。程序分兩部分,一部分為分割和修補(bǔ),另一部分為合成。由兩個(gè)界面構(gòu)成,在分割和修補(bǔ)界面,界面中包含打開,圈定分割區(qū)域,分割,調(diào)色,改變位圖等工具欄功能,并且對(duì)分割后的圖像能夠進(jìn)行修補(bǔ)操作。在合成界面,具有打開圖片,選定需要獲取的圖像信息,以及合成等功能。 2.1分割功能:
13、 總體需求可以歸結(jié)為基于圖像分割算法實(shí)現(xiàn)景物的精確提取功能。 具體通過以下三個(gè)方面實(shí)現(xiàn)。在功能方面,實(shí)現(xiàn)對(duì)所框部分的圖像進(jìn)行前景的提取及顯示,對(duì)該圖像背景和灰度圖像進(jìn)行保存,傳給其他功能模塊圖像的掩膜。在性能方面,時(shí)間特性要求:圖像對(duì)鼠標(biāo)操作的響應(yīng)時(shí)間較短;能進(jìn)行較快的處理分割操作。靈活性要求:可以改變分割圖像的大小;可以改變所提取前景的顏色。在接口方面,得到界面所給的矩形框出的需要處理的圖像的信息,同時(shí)得到被框圖像的左上角和右下角坐標(biāo)。傳回處理好圖像的image指針,圖像的信息和物體的輪廓線指針及掩膜。 2.2合成功能: 我們要實(shí)現(xiàn)的功能模塊是將兩幅或多幅圖像中的信息綜合到一幅圖像
14、中,實(shí)現(xiàn)添加進(jìn)的克隆景物與已有景物的無縫集成,滿足亮度、顏色和結(jié)構(gòu)信息的連續(xù)性和語義合理性。 首先我們要對(duì)將要進(jìn)行融合的圖片進(jìn)行預(yù)處理,讓原圖像和待合成圖像不存在明顯的幾何畸變,在圖像質(zhì)量不理想的情況下進(jìn)行圖像融合,如果不經(jīng)過預(yù)處理,很容易造成一些誤匹配。 下一步是圖像配準(zhǔn),主是對(duì)參考圖像和待融合圖像中的匹配信息進(jìn)行提取,在提取出的信息中尋找最佳的匹配,完成圖像間的對(duì)齊。圖像融合的成功與否主要是取決于圖像的配準(zhǔn)。待融合的圖像之間,可能存在平移、旋轉(zhuǎn)、縮放等多種變換或者大面積的同色區(qū)域等很難匹配的情況,我們將努力實(shí)現(xiàn)能在多種情況下準(zhǔn)確找到圖像間的對(duì)應(yīng)信息,將圖像對(duì)齊。在完成圖像配準(zhǔn)以后,就要
15、對(duì)圖像進(jìn)行縫合,并對(duì)縫合的邊界進(jìn)行平滑處理,使圖像間的合成縫隙不明顯,融合更自然。 2.3修復(fù)功能: 圖像修復(fù)是一項(xiàng)古老的藝術(shù),最早可以追溯到歐洲文藝復(fù)興時(shí)期,為了恢復(fù)遭受破壞的美術(shù)作品,藝術(shù)家們利用人的感知力和想象力對(duì)作品的裂痕等受損區(qū)域進(jìn)行修補(bǔ),使其恢復(fù)和保持圖像的完整性。這一技術(shù)就稱之為Inpainting(修復(fù),潤飾)或稱為Retouching(分涂,修正)。 修復(fù)目的:對(duì)有劃痕或者破損的圖片進(jìn)行數(shù)字掃描后加以修復(fù);在圖像上面增加或者去除物體,比如電影后期制作中發(fā)現(xiàn)圖像中出現(xiàn)了多余的物體,麥克風(fēng),電線等的移除;修補(bǔ)信息缺失區(qū)域,如在數(shù)字圖像或視頻的獲取、處理、壓縮、傳輸和解壓
16、縮過程中因信息丟失所留下的信息缺損區(qū)。 需要修補(bǔ)圖像文件來源不確定,可由用戶自行指定,一般為存儲(chǔ)于本地磁盤的特定圖像文件。圖像文件一般為部分破損、信息缺失、圖像信息贅余等情況的的文件。圖像修復(fù)過程,對(duì)受到損壞的圖像進(jìn)行修復(fù)重建或者去除圖像中的多余物體。例如:照片修復(fù)、去除污物、去除文字、去除目標(biāo)等行為即為此功能實(shí)現(xiàn)效果需求。 3架構(gòu)設(shè)計(jì) 3.1功能設(shè)計(jì) 本軟件主要功能分為數(shù)字圖像的對(duì)象分割、圖像修復(fù)和圖像合成四部分。 首先,研究基于筆刷的對(duì)象分割算法,實(shí)現(xiàn)少量交互輔助下的便捷景物提?。淮思?/p>
17、術(shù)可用于圖像的切割,切割下的圖像可以黏貼至其他圖像,可用于合成新的場(chǎng)景和圖像。利用該項(xiàng)技術(shù)人們可以對(duì)自己喜歡的場(chǎng)景方便的進(jìn)行截取,進(jìn)行圖像處理更加方便。 然后,研究圖像的修復(fù)和拼接算法,實(shí)現(xiàn)景物移除后所遺留的空白區(qū)域的自動(dòng)填補(bǔ);使得新的圖像看不出剪裁過的痕跡且沒有裂縫。利用該技術(shù)可以使原有圖像在切割掉的基礎(chǔ)上依然保持圖像的完整性和連續(xù)性。 最后,研究圖像的融合和合成算法,實(shí)現(xiàn)克隆景物與已有場(chǎng)景的無縫合成。通過這個(gè)系統(tǒng),我們可以方便地移除圖像中不需要的景物、添加進(jìn)原來沒有的景物或者重新編排圖像中已有景物的位置,制作和生成新的虛擬現(xiàn)實(shí)場(chǎng)景圖像。人們可以利用系統(tǒng)制作自己喜歡的圖像,合成搞笑的圖像
18、等。 3.2概要設(shè)計(jì) 3.2.1分割功能 主要思想: 1. 通過高斯混合模型來描述前景與背景的分布。 2. 通過迭代方法求取高斯混合模型中的各個(gè)參數(shù)。 3. 通過非完全標(biāo)記方法,用戶只需利用矩形框標(biāo)記處背景區(qū)域即可。 4. 通過與高斯混合模型進(jìn)行比較后,將得出的前景輪廓以鏈表的形式返回。 功能流程圖: 圖3 代碼實(shí)現(xiàn): 1. 從用戶交互界面得到用戶確定的矩形的坐標(biāo)(左上角和右下角)。 2. 使用cvKMeans2()函數(shù)對(duì)高斯模型進(jìn)行聚類。從確定的矩形的中心開始采樣,并對(duì)沿著2條對(duì)角線方向,取適量像素。 3. 建立高斯混合模型 1) 定義5個(gè)高斯模型組件,對(duì)
19、其進(jìn)行初始化(全部為1或全部為0)。 (將每個(gè)像素的像素值代入到高斯方程中進(jìn)行估算,以便將適合的像素點(diǎn)劃分到各個(gè)高斯模型組件中。) 2) 利用迭代最小化方法求取混合高斯模型的參數(shù)(主要是均值和方差): 混合高斯模型給出的概率密度函數(shù)實(shí)際上是幾個(gè)高斯概率密度函數(shù)的加權(quán)和: 其中 . 定義事件 , 則 . 據(jù)此可以產(chǎn)生服從上述混合高斯概率密度分布的樣本. 混合分布的均值為 方差為 a. 為未知區(qū)域的每個(gè)像素點(diǎn)n設(shè)置高斯混合模型參數(shù) b. 由圖像中各個(gè)像素的數(shù)據(jù)求得高斯混合模型參數(shù)θ U (α, k,θ, z) = ∑D (αn
20、 , kn ,θ, zn ) D (αn , kn ,θ, z) = - log p ( zn | αn , kn ,θ) - logw (αn , kn ) 其中p (·) 是高斯概率分布, w (·) 是該高斯模型的樣本數(shù)在總樣本中權(quán)值 c. 利用最小化能量來得到初始分割 d. 回到步驟a重復(fù)執(zhí)行,直到收斂為止; e. 進(jìn)行邊界優(yōu)化。 4. 對(duì)矩形框中圖像的每一個(gè)像素進(jìn)行處理,看是否匹配某個(gè)模型,若匹配則將該像素標(biāo)記為1,若不匹配則標(biāo)記為0。 利用for循環(huán)對(duì)矩形內(nèi)的像素點(diǎn)進(jìn)行遍歷,定義一個(gè)表示各像素匹配結(jié)果的變量,當(dāng)像素符合高斯模型的特征值時(shí),將
21、該變量標(biāo)記為1,否則標(biāo)記為0。 5. 利用循環(huán)遍歷矩形中各像素的匹配特征值,將變量值為1的像素點(diǎn)坐標(biāo)建立成鏈表返回。 3.3合成功能: 主要思路: 對(duì)于每幅數(shù)字圖像,我們都可以看成由確定的像素組成,假設(shè)圖像的每個(gè)像素看成由圖像分割的每個(gè)網(wǎng)格。假設(shè)S和是無限像素網(wǎng)格中的有限點(diǎn)集。注意到S可能包含了網(wǎng)格中的所有像素,也可能只是部分像素。對(duì)于S中的每個(gè)像素p,Np是S中相關(guān)四個(gè)像素的集合。
表示一對(duì)像素,其中q屬于Np; 的邊界;fp表示f函數(shù)中p點(diǎn)的值。我們的目的是使得將泊松方程變幻后最終可得到: 其中f*是S中除去領(lǐng)域中的一個(gè)已知函數(shù),f是中定義的一個(gè)未知函數(shù)。 當(dāng)包含S邊
22、緣像素時(shí),如果延伸到整個(gè)網(wǎng)格區(qū)域時(shí),p有截短領(lǐng)域,|Np|<4 也就是Np屬于. 方程可簡化成: 其中vpq是v((p+q)/2)在向量pq上的投影。 求解出該方程組,得到新的像素值。 功能流程圖: 圖4 代碼實(shí)現(xiàn): 代碼實(shí)現(xiàn)上主要涉及到三個(gè)函數(shù),divengence()函數(shù)對(duì)圖像的特征進(jìn)行提取,求出圖像的散度。posionPaste()函數(shù),實(shí)現(xiàn)兩幅圖像的融合。其中possionPaste中調(diào)用的子函數(shù)doCal()對(duì)圖像泊松方程進(jìn)行求解。 3.4修補(bǔ)實(shí)現(xiàn): 主要思想: 修補(bǔ)模塊分為修補(bǔ)主函數(shù),輪廓函數(shù),計(jì)算優(yōu)先級(jí)函數(shù),修補(bǔ)函數(shù)。 1修補(bǔ)主函數(shù)獲取上層分割完
23、成后傳入的帶修補(bǔ)圖像指針和Mask模板圖指針,Mask模板圖作為傳入的帶修補(bǔ)圖像任意像素是否真實(shí)的對(duì)照表。將待修補(bǔ)圖像指針和Mask模板圖指針傳給輪廓函數(shù)。 2輪廓函數(shù)建立原圖像待修補(bǔ)區(qū)域輪廓的鏈表,依操作據(jù)輪廓鏈表節(jié)點(diǎn)對(duì)圖像相應(yīng)像素進(jìn)行。對(duì)輪廓鏈表的每個(gè)節(jié)點(diǎn)調(diào)用優(yōu)先級(jí)函數(shù)。 優(yōu)先級(jí)函數(shù)獲取傳入像素點(diǎn)位置,可計(jì)算任意點(diǎn)像素的優(yōu)先級(jí)。 3對(duì)輪廓中優(yōu)先級(jí)最大的點(diǎn)調(diào)用修補(bǔ)函數(shù),通過搜尋與以該點(diǎn)為樣本塊最相似的區(qū)域來填充樣本塊,完成修補(bǔ),更新Mask模板圖和帶修補(bǔ)區(qū)域輪廓。 重復(fù)2~3步,直至輪廓鏈表為空。 功能流程圖: 圖5
24、 4迭代日志 4.1界面迭代: 第一次迭代:界面需求功能的確定,界面初步具有文件,編輯,視圖,工具欄等基本功能 圖6 第二次迭代:增加界面菜單功能,工具欄功能 a) 文件菜單: 圖7 b) 編輯菜單: 圖8 c) 視圖菜單: 圖9 第三次迭代:程序能夠打開圖片,并且能畫出一個(gè)矩形確定范圍(格式為JPG和BMP) 圖10 圖11 第四次迭代:修改界面,去掉編輯功能,增加process菜單:包括功能打開新圖,以及獲取矩形框里圖像 圖12 Process菜單: 圖13 第五次迭代:添加New_Ima
25、ge功能代碼:形成副圖 圖14 圖中黑色部分為副圖打開的顯示位置 第六次迭代:完成副圖上的打開圖片和重新圈定功能: 打開圖片 圖15 圈定功能: 圖16 第七次迭代:完成process菜單中,cut_image功能 圖17 Cut_image功能完成后,圈定出來得部分如圖左上顯示 第八次迭代:完成保存部分圖像 圖18 第九次迭代:重做界面,分割和修補(bǔ)一程序界面,合成一個(gè)程序界面 完成分割修補(bǔ)界面: 圖19 文件菜單: 圖20 操作: 圖21
26、 幫助: 圖22 完成合成界面: 圖23 文件菜單: 圖24 4.2分割迭代: 第一次迭代: 項(xiàng)目組成立第一次會(huì)議,集體討論分工,以及分組。初步學(xué)習(xí)OpenCV以及數(shù)字圖像處理方面的知識(shí)。了解當(dāng)今的圖像處理軟件的前景和現(xiàn)狀,并對(duì)常用的功能以及原理有所了解。 第二次迭代: 閱讀圖像分割的相關(guān)方面資料,運(yùn)用OpenCV完成程序:在一幅圖片上繪制正弦曲線,改變線寬,填充顏色,實(shí)現(xiàn)小球沿曲線滾動(dòng)。 第三次迭代: 對(duì)第二階段練習(xí)的程序進(jìn)行完善,鞏固軟件的編寫基礎(chǔ)。 第四次迭代: 對(duì)分割功能模塊的相關(guān)算法
27、進(jìn)行閱讀與理解,確定各個(gè)模塊間的參數(shù)傳遞以及界面的接口設(shè)計(jì),嘗試編寫功能代碼。 第五次迭代: 從多個(gè)算法中確定要使用的算法,并對(duì)這些算法進(jìn)行深刻理解,對(duì)功能代碼進(jìn)行些微的變動(dòng)及完善。 第六次迭代: 主攻編寫功能實(shí)現(xiàn)代碼及調(diào)試,檢驗(yàn)算法的完善程度。 第七次迭代: 與其他小組的進(jìn)行詳細(xì)討論,適當(dāng)修改代碼以便能很好得集成到一起。 第八次迭代: 與界面進(jìn)行集成。 4.3合成迭代: 第一次迭代:開發(fā)工具的學(xué)習(xí):開始接觸這個(gè)工程的時(shí)候首先是對(duì)開發(fā)軟件的新工具OpenCv的學(xué)習(xí). 首先安裝visual studio2003和openCV1.0開發(fā)環(huán)境,熟悉visual studio2
28、003各類工具操作和學(xué)習(xí)openCV基礎(chǔ),編寫練習(xí)簡單的openCV程序,如圖像的讀寫訪問轉(zhuǎn)換等,主要學(xué)習(xí)OpenCv中的函數(shù),函數(shù)的參數(shù)以及具體如何調(diào)用. 練習(xí)簡單的openCV程序,如圖像的讀寫訪問轉(zhuǎn)換等。參考的資料主要有<<學(xué)習(xí)OpenCV>>。 第二次迭代:九月中(11~20號(hào))代碼練習(xí):通過小例子練習(xí)對(duì)圖像的操作,主要的程序練習(xí):打開一幅圖像,以圖像四條邊的中點(diǎn)為頂點(diǎn)畫一個(gè)菱形,在菱形框中填充顏色,并設(shè)置菱形邊的寬度和顏色,在菱形邊上畫一個(gè)小球,小球沿著菱形邊做循環(huán)運(yùn)動(dòng).通過對(duì)該功能的實(shí)現(xiàn)主要熟悉了對(duì)圖像像素進(jìn)行操作,以及如何用鏈表存儲(chǔ)圖像信息. 第三次迭代:明確項(xiàng)目需求,編寫需
29、求文檔:參加這個(gè)項(xiàng)目以后,就軟件的整體需求開過多次會(huì)議,在代碼練習(xí).在明確了項(xiàng)目需求后,通過小組討論劃分了三個(gè)小組,分別實(shí)現(xiàn)軟件的不同功能點(diǎn).我們小組主要負(fù)責(zé)圖像融合算法的實(shí)現(xiàn).通過參考資料和文檔對(duì)該功能的進(jìn)一步理解,這一階段主要內(nèi)容是對(duì)算法的理解,以及對(duì)功能實(shí)現(xiàn)的初步架構(gòu).初步編寫技術(shù)文檔。 第四次迭代:整體架構(gòu)設(shè)計(jì),細(xì)化需求文檔:在對(duì)圖像融合算法有了總體理解的基礎(chǔ)上,要求對(duì)整個(gè)功能的實(shí)現(xiàn)提出整體的架構(gòu)設(shè)計(jì),并以技術(shù)文檔的形式進(jìn)行闡述.小組成員的工作進(jìn)行進(jìn)一步細(xì)分.根據(jù)圖像融合算法主要實(shí)現(xiàn)的兩大塊,列方程和求解方程.小組討論各自負(fù)責(zé)一個(gè)模塊. 這一階段要求對(duì)算法有明確的理解和初步實(shí)現(xiàn)代碼的
30、整體思路,對(duì)項(xiàng)目技術(shù)文檔進(jìn)行進(jìn)一步細(xì)化,畫出整體流程框圖,編寫部分偽代碼。 第五次迭代:代碼實(shí)現(xiàn):根據(jù)先前的思路以及對(duì)整個(gè)融合功能的理解,通過相關(guān)知識(shí),將整體架構(gòu)設(shè)計(jì)轉(zhuǎn)化為具體代碼,以函數(shù)分塊實(shí)現(xiàn)具體功能. 第六次迭代:與主界面進(jìn)行集成,將融合部分功能與主界面進(jìn)行集成,確定集成接口和參數(shù)類型,修改代碼以實(shí)現(xiàn)各模塊的集成。 4.4修補(bǔ)迭代: 第一次迭代:小組內(nèi)部軟件需求分析,軟件功能模塊架構(gòu),研究受損圖像的可靠修補(bǔ)算法,并完成對(duì)修補(bǔ)算法的可行性分析,畫出算法流程圖。并學(xué)習(xí)計(jì)算機(jī)圖形學(xué)和計(jì)算機(jī)圖像學(xué)的相關(guān)技術(shù)和知識(shí)。 第二次迭代:根據(jù)算法流程圖,完成對(duì)算法的代碼架構(gòu),完成修補(bǔ)主函數(shù)R
31、epair()代碼和各功能點(diǎn)函數(shù)代碼框架。 第三次迭代:對(duì)輪廓函數(shù)Boundary()的代碼編寫,通過獲取上層函數(shù)傳入的待修補(bǔ)圖像指針和Mask圖,確定待修補(bǔ)區(qū)域的邊界輪廓線。 第四次迭代:計(jì)算優(yōu)先級(jí)函數(shù)Priority()的置信項(xiàng)和數(shù)據(jù)項(xiàng)部分代碼編寫。 第五次迭代:完成優(yōu)先級(jí)函數(shù)Priority()剩余部分編寫,并對(duì)修補(bǔ)函數(shù)repairing()搜尋相似樣本塊部分的代碼編寫。 第六次迭代:完成修補(bǔ)函數(shù)Repairing()的剩余部分代碼編寫,并對(duì)更新函數(shù)Update()進(jìn)行代碼編寫,刪除被修補(bǔ)像素并更新Mask圖。 第七次迭代:修改修補(bǔ)主函數(shù)Repair(),完成對(duì)子函數(shù)的調(diào)用,并
32、對(duì)各函數(shù)進(jìn)行代碼走查,發(fā)現(xiàn)邏輯錯(cuò)誤和語法錯(cuò)誤。與其他小組進(jìn)行集成。 第八次迭代:對(duì)集成完畢的軟件進(jìn)行測(cè)試,發(fā)現(xiàn)軟件缺陷并對(duì)已知的Bug進(jìn)行修復(fù)。 5分工情況 黃超 趙劍華 孫芳芳 謝彩燕 施盛楠 胡華東 項(xiàng)目管理 100% 0% 0% 0% 0% 0% 需求分析 16.5% (分割功能模塊的需求分析) 17.5% (界面模塊的需求分析) 16.5% (分割功能模塊的需求分析) 16.5% (合成功能模塊的需求分析) 16% (合成功能模塊的需求分析
33、) 17% (修補(bǔ)功能模塊的需求分析) 架構(gòu)設(shè)計(jì) 16.5% (分割模塊的架構(gòu)設(shè)計(jì)以及接口設(shè)計(jì)) 17.5% (界面模塊的架構(gòu)設(shè)計(jì)以及接口設(shè)計(jì)) 16.5% (分割模塊的架構(gòu)設(shè)計(jì)以及接口設(shè)計(jì)) 16.5% (合成模塊的架構(gòu)設(shè)計(jì)以及接口設(shè)計(jì)) 16% (合成模塊的架構(gòu)設(shè)計(jì)以及接口設(shè)計(jì)) 17% (修補(bǔ)模塊的架構(gòu)設(shè)計(jì)以及接口設(shè)計(jì)) 編碼與測(cè)試 17.5% (分割模塊的編碼以及測(cè)試) 17.5% (界面模塊的編碼以及測(cè)試) 15.5% (分割模塊的編碼以及測(cè)試) 16.5% (合成模塊的編碼以及測(cè)試) 15% (合成模塊的編碼以及測(cè)試) 17.5
34、% (修補(bǔ)模塊的編碼以及測(cè)試) 文檔編寫 24% (項(xiàng)目概述,分工情況以及分割模塊的功能模塊需求,功能模塊架構(gòu),開發(fā)過程的迭代情況,遇到的問題和解決方案,以及文檔總體的整理) 25% (項(xiàng)目的頂層架構(gòu)設(shè)計(jì),用戶手冊(cè)以及界面模塊的功能模塊需求,開發(fā)過程的迭代情況,使用手冊(cè),遇到的問題和解決方案) 12.5% (分割模塊的功能模塊需求,開發(fā)過程的迭代情況,遇到的問題和解決方案) 12.5% (合成模塊的功能模塊架構(gòu),開發(fā)過程的迭代情況,遇到的問題和解決方案) 12.5% (合成模塊的功能模塊需求,開發(fā)過程的迭代情況,遇到的問題和解決方案) 13.5% (修補(bǔ)模塊的功能模
35、塊需求,功能模塊架構(gòu),開發(fā)過程的迭代情況,使用手冊(cè),遇到的問題和解決方案) 6FAQ 6.1環(huán)境配置: 1. OpenCV的安裝以及在Microsoft Visual Studio.NET 2003中的配置問題。 解決方法:下載OpenCV 1.0安裝包,點(diǎn)擊安裝程序進(jìn)行安裝。配置方法: 定制全局選項(xiàng) · 打開VC++.net應(yīng)用程序,在菜單項(xiàng)里選擇:Tools->Options · 在列表中,選擇Projects->VC++ Directories · 首先,從“Show Directories for”的list box中選擇“L
36、ibrary files” · 單擊“Insert New”圖標(biāo),定位你安裝opencv的文件夾 · 假設(shè)它安裝于“C:\Program Files\OpenCV” · 在庫文件列表中,定位并添加: "C:\Program Files\OpenCV\lib" 圖25 · 然后在list box中選擇include文件,定位并添加以下路徑: C:\Program Files\OpenCV\cv\include C:\Program Files\OpenCV\cxcore\include C:\Program Files\OpenCV\otherlibs\highg
37、ui C:\Program Files\OpenCV\cvaux\include C:\Program Files\OpenCV\otherlibs\cvcam\include 圖26 · 接下來,選擇list box中的source文件,定位并添加一下路徑 C:\Program Files\OpenCV\cv\src C:\Program Files\OpenCV\cxcore\src C:\Program Files\OpenCV\cvaux\src C:\Program Files\OpenCV\otherlibs\highgui C:\Program Files\O
38、penCV\otherlibs\cvcam\src\windows 圖27 · 單擊選項(xiàng)對(duì)話框的“OK” · 現(xiàn)在你就正確配置好了全局設(shè)置。 創(chuàng)建 新的項(xiàng)目 · 在Developer Studio中創(chuàng)建新的application · 從菜單中選擇"File"->"New..."->"Projects" · 選擇“Win32 Application"或者"Win32 console application",后者更加容易,示例都采取這種方式 圖28 · 輸入項(xiàng)目名稱現(xiàn)則位置 · 單擊OK,在向?qū)е械闹苯訂螕鬴inish。 圖29 以上步驟之后deve
39、loper studio將創(chuàng)建一個(gè)項(xiàng)目文件夾(缺省與項(xiàng)目同名)、
40、,按F7進(jìn)行Build,會(huì)有些Link錯(cuò)誤。 · 添加項(xiàng)目的depencency · 從菜單:“Projcet”->“Properties” · 選擇"Link"tab -> "Input" -> "Additional Dependencies"。添加所有需要的庫 (cxcore[d].lib cv[d].lib highgui[d].lib cvaux[d].lib cvcam[d].lib) 圖30 這就可以了,現(xiàn)在用F5編譯、運(yùn)行。 圖31 2.安裝opencv完后的配置問題 解決方法:看老師給的安裝文檔解決,原來是沒有把所需的lib文件包含進(jìn)來 3.
41、安裝Microsoft Visual Studio 2003時(shí)出現(xiàn)問題,是計(jì)算機(jī)系統(tǒng)的問題 解決方法:在安裝2003時(shí)放入老師給的windows XP系統(tǒng)安裝盤 4.編程前提的奠基 解決方案:開發(fā)之前必須準(zhǔn)備好編程的開發(fā)環(huán)境。要有開發(fā)軟件以及其他的必要條件。 5.安裝開發(fā)軟件 解決方案:本次開發(fā)使用的是vs 2003的軟件版本,在安裝時(shí)需要使用windows XP的系統(tǒng)環(huán)境支持,對(duì)于其他的環(huán)境支持可能并不是很好。特別對(duì)于w7之類的較為新穎的操作系統(tǒng)兼容性并不強(qiáng)。因此建議使用XP的操作系統(tǒng)進(jìn)行安裝開發(fā)。在安裝vs 2003 的版本軟件時(shí),注意到可能會(huì)安裝失敗??赡苁钱?dāng)前操作系統(tǒng)缺失了部
42、分系統(tǒng)文件。解決方法可以選擇使用安裝光盤安裝好缺失的部分。在安裝過程中可以自行選擇安裝部分。建議只需安裝需要的部分即可,以免占用較多的硬盤空間造成不便。 6.OPENCV 的配置問題 解決方案:對(duì)于較早版本的vs c++配置較為方便,但是現(xiàn)在的編程工具不斷進(jìn)步,c++6.0的配置和vs 2003 的配置又有所不同。在配置中應(yīng)當(dāng)注意一些問題 ,特別是路徑的正確性,已經(jīng)庫的全部導(dǎo)入,不可缺失。 7.開發(fā)環(huán)境的配置問題,我們小組一開始是在VC2008下,但是遇到了很多的問題,尤其反復(fù)出現(xiàn)了“MSVCR90D.dll not found”這個(gè)問題。 解決方法:方法一:在解決方案配置中使用rel
43、ease模式,如果再有錯(cuò)誤就說明你的程序錯(cuò)了,在realise模式下,不能方便的調(diào)試。 方法二:項(xiàng)目->屬性->配置屬性->連接器->常規(guī) ,把啟用增量連接改為否。 8. 在一開始OpenCV安裝后“沒有找到cxcore100.dll” 解決方法:這是因?yàn)樵诎惭b時(shí)選擇”將\OpenCV\bin加入系統(tǒng)變量”(Add\OpenCV\bin to the systerm PATH)。 但該選項(xiàng)并不一定能成功添加到系統(tǒng)變量,如果編寫的程序在運(yùn)行時(shí)出現(xiàn)“沒有找到cxcore100.dll說明這個(gè)應(yīng)用程序未啟動(dòng),重新安裝應(yīng)用程序可能會(huì)修復(fù)此問題。主要解決方案: 手動(dòng)在我的電腦->屬性->高級(jí)->環(huán)
44、境變量->系統(tǒng)變量->path添加c:\program files\opencv\bin; 添加完成后需要重啟計(jì)算機(jī)。 9.在后來改用VC2005后也遇到了一個(gè)問題,運(yùn)行程序時(shí)出現(xiàn)“應(yīng)用程序初始化錯(cuò) 解決方法:打開OpenCV安裝目錄下的_make文件夾,用VS2005打開其中的opencv.sln,進(jìn)行批生成(生成->批生成->僅選擇所有的debug|win32和release|win32->生成) 10.以上生成過程中有時(shí)會(huì)出現(xiàn) “fatal error LNK1181: 無法打開輸入文件“cvauxd.lib”和“error C2039: ‘foreground_regions’不
45、是‘CvFGDStatModel’的成員”兩個(gè)錯(cuò)誤 解決方法:在解決方案資源管理器中打開 “cvaux->Include->External的cvaux. h文件,用查找功能找到上述foreground_regions成員,會(huì)發(fā)現(xiàn)此成員已被注釋掉了,只要將其上一行末尾的“/”改為“*/”使該成員可見,再次啟動(dòng)項(xiàng)目,應(yīng)該就可以編譯通過了。 11.一開始使用opencv編程時(shí)由于頭文件忘記添加會(huì)有編譯沒通過,后來就記住了。 12.調(diào)試時(shí)遇到fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"”? 解決方法:選
46、擇“配置屬性”- “c/c++ ”-預(yù)編譯頭-選擇“不使用預(yù)編譯頭”。 開放環(huán)境的配置不正確。 解決方法: 咨詢正確安裝了軟件的同學(xué),對(duì)比步驟,重新進(jìn)行配置。 13.代碼編譯時(shí)提示找不到相關(guān)文件的錯(cuò)誤。 解決方案:將OpenCv安裝路徑下的dll文件復(fù)制到系統(tǒng)中。 14.Vistual studio 2008運(yùn)行速度太慢。 解決方法:改為使用Vistual studio 2003。 15. 提示IplImage類型未定義,即無法識(shí)別OpenCv庫函數(shù)。 解決方案:在新建的工程中加入lib庫,具體做法是:選擇工程屬性—Configuration Properties-Lin
47、ker-Input將需要用到的類庫包含進(jìn)來,如下圖: 圖32 6.2代碼編寫: 1.在項(xiàng)目初始階段,由于閱讀的材料范圍比較廣泛,每個(gè)功能模塊都有涉及到并且各個(gè)功能模塊又有各種算法操作,在沒決定用哪些算法之前,這些閱讀資料都需閱讀,所以有很多具體的算法難以理解 解決方法:詢問老師并且通過網(wǎng)絡(luò)對(duì)這些算法進(jìn)行查詢,初步有些了解。 2.在確定具體用grabcut算法后閱讀針對(duì)性的文檔,對(duì)高斯混合模型以及em算法(求解最大似然函數(shù)極值)的理解過程中遇到問題。 解決方法:閱讀圖書館有關(guān)書籍及詢問老師并且通過網(wǎng)絡(luò)查詢,確定建立的高斯模型數(shù)目,用em迭代算法求解混合高斯模型。 3.具體的
48、對(duì)opencv應(yīng)用通過寫程序練習(xí),其中一個(gè)的要求是創(chuàng)建圖片畫菱形并對(duì)菱形著色,但是不知道如何改變顏色,這必須對(duì)圖像有所了解。 解決方法:看opencv文檔中的例子及各種函數(shù)的應(yīng)用情況,利用CvScalar和Cvget2D,Cvset2D來設(shè)置圖片像素的顏色。 4.具體的對(duì)opencv應(yīng)用通過寫程序練習(xí),其中一個(gè)的要求是創(chuàng)建圖片或者以任意圖像作為背景圖片顯示正弦曲線,可以對(duì)曲線的線寬及顏色進(jìn)行改變,還可以對(duì)其內(nèi)部進(jìn)行著色,曲線的高矮胖瘦都可以改變,有一個(gè)小球沿著曲線進(jìn)行滾動(dòng)。 其中在運(yùn)用數(shù)據(jù)結(jié)構(gòu)的時(shí)候遇到問題,宏定義線寬為thickness也出錯(cuò),還有在改變線寬時(shí)對(duì)像素的處理我在上下加寬度
49、值,殊不知由于我們的是正弦曲線而并非很正規(guī)的線條,產(chǎn)生的效果并不理想,變成波峰波谷處粗中間細(xì),小球滾動(dòng)部分,不知道用什么函數(shù)。 解決方法:數(shù)據(jù)結(jié)構(gòu)部分我是查看以前學(xué)的數(shù)據(jù)結(jié)構(gòu)書籍;由于thickness在opencv中已有,所以將線寬宏定義名改為thick;線的寬度部分通過在正弦曲線的法線方向加2/thick的方法解決;通過查找,小球滾動(dòng)部分用cvCircle()及cvShowImage()方法實(shí)現(xiàn)。 5.具體編寫切割代碼部分,em對(duì)各個(gè)參數(shù)的初始化問題及其他編程問題。 解決方法:看書、看文檔、上網(wǎng)查資料,老師的指導(dǎo)及組員間的相互討論。 6.小組成員間需要哪些數(shù)據(jù)傳遞,以及與其他組的接
50、口部分的問題。 解決方法:老師的指導(dǎo)及組員間的相互討論 7.如果打開圖片 解決方法: ①、新建一個(gè)單文檔的應(yīng)用程序,項(xiàng)目名稱為ShowBitmap ②、為CShowBitmapView類添加下述成員變量和成員函數(shù): //參數(shù)定義 public: ????int state;????//位圖顯示狀態(tài) ???? CString BmpName;????//保存圖像文件文件名 ???? CString extname;????//保存圖像文件擴(kuò)展名 ???? CBitmap m_bitmap;????//創(chuàng)建位圖對(duì)象 ????void ShowBitmap(CString B
51、mpName);????//用來顯示指定位圖的函數(shù) ???? BOOL ShowJpgGif(CDC* pDC,CString strPath, int x, int y); ③、在CShowBitmap類的構(gòu)造函數(shù)中,初始化成員變量state // CShowBitmapView 構(gòu)造/析構(gòu) CShowBitmapView::CShowBitmapView() { ???? state=0; } ④、為ID_FILE_OPEN消息添加響應(yīng)函數(shù)(具體怎么加就不細(xì)說了),編寫該函數(shù) // CShowBitmapView 消息處理程序 void CShowBitmapV
52、iew::OnFileOpen() { ????//CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位圖文件(*.BMP;*.jpg)|*.BMP;*.jpg|"));?? //這行代碼可以打開BMP格式的圖片 ???? CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位圖文件(*.BMP)|*.BMP|jpg文件(*.jpg)|*.jpg||")); //這行代碼可以打開B
53、MP和JPG格式的圖片 //gif格式圖片的打開在這就不列出來了,留給各位自己嘗試吧,對(duì)于gif格式圖片的顯示圖片函數(shù)和jpg格式圖片是同一個(gè)函數(shù)。 ???? if (IDOK==dlg.DoModal()) ???? { ???????? state=0; ???????? BmpName.Format(_T("%s"),dlg.GetPathName()); ?????????extname = dlg.GetFileExt();???????????? //返回選定文件的擴(kuò)展文件名 ???????? extname.MakeLower(); ???????? if (0
54、==extname.Compare(_T("bmp"))) ???????? { ???????????? ShowBitmap(BmpName); ???????? } ???????? else ???????? { ???????????? state=1; ???????? } ????????Invalidate(); ???? } } ⑤、編寫B(tài)MP圖片顯示函數(shù) void CShowBitmapView::ShowBitmap(CString BmpName) { ????if (state==0) ???? {???????????? ??????
55、?? HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); ???????? m_bitmap.Detach(); ???????? m_bitmap.Attach(hBitmap); ???????? state=1; ???????? Invalidate(); ???? } } ⑥、編寫jpg或gif格式圖片顯示程序 BOOL CShowBitmapView::ShowJpgGif(CDC*
56、pDC,CString strPath, int x, int y) { ???? IStream *pStm;?? ???? CFileStatus fstatus;?? ???? CFile file;?? ???? LONG cb;?? ????//打開文件并檢測(cè)文件的有效性 ????if (file.Open(strPath,CFile::modeRead)&& ???????? file.GetStatus(strPath,fstatus)&& ???????? ((cb = fstatus.m_size) != -1))?? ???? {?? ???
57、????? HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);?? ???????? LPVOID pvData = NULL;?? ????????if (hGlobal != NULL)?? ???????? {?? ???????????? pvData = GlobalLock(hGlobal); ????????????if (pvData != NULL)?? ???????????? {?? ????????????????//file.ReadHuge(pvData, cb);??//6.0中可能是用這個(gè)函數(shù) ??
58、?????????????? file.Read(pvData, cb);??//VC2005.NET中用這個(gè)函數(shù) ???????????????? GlobalUnlock(hGlobal);?? ???????????????? CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);?? ???????????? } ???????? } ???? } ????else ???? { ????????return false; ???? } //打開文件結(jié)束 ????//顯示JPEG和GIF格式的圖片,GIF只能顯示一幀
59、,還不能顯示動(dòng)畫, ????//要顯示動(dòng)畫GIF請(qǐng)使用ACTIVE控件。 ???? IPicture *pPic; ????//load image from file stream ????if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic))) ???? { ???????? OLE_XSIZE_HIMETRIC hmWidth;?? ???????? OLE_YSIZE_HIMETRIC hmHeight;?? ???????? pP
60、ic->get_Width(&hmWidth);?? ???????? pPic->get_Height(&hmHeight);?? ????????double fX,fY;?? ????????//get image height and width ???????? fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);?? ???????? fY = (double)pDC->GetDeviceCaps(VERTRE
61、S)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);?? ????????//use render function display image ????????if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))?? ???????? { ???????????? pPic->Release(); ????????????return false; ???????? } ??
62、?????? pPic->Release();?? ???? }?? ????else?? ???? { ????????return false;?? ???? } ????return true; } ⑦、修改OnDraw函數(shù),實(shí)現(xiàn)圖片的顯示 // CShowBitmapView 繪制 void CShowBitmapView::OnDraw(CDC* pDC) { ???? CShowBitmapDoc* pDoc = GetDocument(); ???? ASSERT_VALID(pDoc); ????if (!pDoc) ????????re
63、turn; ????if (state==1) ???? { ????????if (0 == extname.Compare(_T("bmp"))) ???????? { ???????????? CDC dcImage; ????????????if (!dcImage.CreateCompatibleDC(pDC)) ???????????? { ????????????????return; ???????????? } ???????????? BITMAP bm; ???????????? m_bitmap.GetBitmap(&bm); ???????
64、????? dcImage.SelectObject(&m_bitmap); ???????????? pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcImage,0,0,SRCCOPY); ???????? } ????????else ???????? { ????????????if (0 == extname.Compare(_T("jpg"))) ???????????? { ???????????????? ShowJpgGif(pDC,BmpName,1,1); ???????????? } ???????? } ????
65、} } 8.滾動(dòng)條實(shí)現(xiàn) 解決方法: ①、建立工程時(shí),將 View 類繼承自 CScrollView ②、在 OnInitialUpdate 中添加初始化時(shí) Scroll 的相關(guān)屬性值 CSize sizeTotal(0,0); SetScrollSizes(MM_TEXT,sizeTotal); ③、打開文件 ( 圖像后 ) 根據(jù)圖像的大小,設(shè)置滾動(dòng)屬性值 ChangeScrollRange(); // 自定義函數(shù) ④、在 View 類中添加成員變量。 作用是存儲(chǔ)圖像顯示位置與原點(diǎn)的 offset int m_ImgVScrollPos ;
66、 // VScroll distance int m_ImgHScrollPos ; // HScroll distance ⑤、滾動(dòng)處理 添加自定義響應(yīng) WM_VSCROLL 、 WM_HSCROLL 消息的事件函數(shù): OnVScroll 、 OnHScroll void CSockIIView :: OnVScroll ( UINT nSBCode , UINT nPos , CScrollBar * pScrollBar ) { // TODO: Add your message handler code here and/or call default SCROLLINFO si ; GetScrollInfo ( SB_VERT ,& si , SIF_ALL ); m_ImgVScrollPos = si . nPos ; Invalidate ( TRUE ); CScrollView :: OnVScroll ( nSBCode , nPos , pScrollBar ); } ⑥、圖像顯
- 溫馨提示:
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. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備采購常用的四種評(píng)標(biāo)方法
- 車間員工管理須知(應(yīng)知應(yīng)會(huì))
- 某公司設(shè)備維護(hù)保養(yǎng)工作規(guī)程
- 某企業(yè)潔凈車間人員進(jìn)出管理規(guī)程
- 企業(yè)管理制度之5S管理的八個(gè)口訣
- 標(biāo)準(zhǔn)化班前會(huì)的探索及意義
- 某企業(yè)內(nèi)審員考試試題含答案
- 某公司環(huán)境保護(hù)考核管理制度
- 現(xiàn)場(chǎng)管理的定義
- 員工培訓(xùn)程序
- 管理制度之生產(chǎn)廠長的職責(zé)與工作標(biāo)準(zhǔn)
- 某公司各級(jí)專業(yè)人員環(huán)保職責(zé)
- 企業(yè)管理制度:5S推進(jìn)與改善工具
- XXX公司環(huán)境風(fēng)險(xiǎn)排查及隱患整改制度
- 生產(chǎn)車間基層管理要點(diǎn)及建議