李永成 李孟宇
摘 要: 為了解決三維模型轉(zhuǎn)化為3D立體圖像的問題,采用通過軟件編程對(duì)圖像進(jìn)行濾色處理后再次合成的方法。該方法通過讀取3DMax導(dǎo)出的3ds格式數(shù)據(jù)文件進(jìn)行圖像顯示,對(duì)兩個(gè)不同視角的圖像抓屏,根據(jù)分色顯示原理對(duì)抓取的圖像進(jìn)行濾色處理,合成符合分色3D立體要求的新圖像,借助分色眼鏡,可以觀察到圖像的3D立體效果。研究結(jié)果表明,用該方法無需借助第三方軟件,使3D立體圖像的制作更加靈活和快捷,并且圖像具有較快的顯示速度。
關(guān)鍵詞: 分色法立體3D; 三維圖像; 3ds格式; 圖像處理
中圖分類號(hào):TP391.9 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2018)09-62-04
Abstract: In order to solve the problem of converting 3D model into a 3D stereoscopic image, this paper adopts a method of recomposing the image after performing color filter processing through software programming. This method displays images by reading 3DMax-derived 3ds format data files, captures two different views of the image, filters the captured images according to the separation display principle, and synthesizes new images which meet 3D stereoscopic requirements. With the help of color separation glasses, the 3D stereoscopic effect of the image can be observed. The result of the research shows that this method can make 3D stereoscopic images more flexible and faster without using third-party software, and the images have faster display speed.
Key words: color-separation stereoscopic 3D; 3D images; 3ds format; images processing
0 引言
無論是影視作品還是圖像攝影作品,3D技術(shù)都得到廣泛的應(yīng)用,3D技術(shù)可以最大限度地還原實(shí)際現(xiàn)場(chǎng),尤其是3D電影的出現(xiàn),更是給人們的娛樂帶來了一種全新的體驗(yàn)。3D顯像的方法有很多,其中的分色法(色差式)制作的影像其3D效果雖然較差,需要佩戴分色眼鏡,但因其制作方便,圖像處理軟件Photoshop[1-3]就可以方便地制作,而且眼鏡的制作成本低廉,因此仍然得到較大的應(yīng)用。
在一些軟件開發(fā)中,如果依靠圖像處理軟件進(jìn)行3D立體圖像的制作,則往往因?yàn)槿鄙贁?shù)據(jù)接口而難以實(shí)現(xiàn),尤其是對(duì)于大量的圖像需要處理的場(chǎng)合,依靠圖像處理軟件顯然是不合適的,一種可行的方法是,設(shè)計(jì)自己的算法進(jìn)行圖像處理。對(duì)于3DMax制作的三維圖形,屏幕上顯示的實(shí)際是二維的圖像,只是可以變換角度進(jìn)行顯示而已,并無3D立體效果,如何將三維圖像轉(zhuǎn)換成3D立體圖像是本文研究的內(nèi)容。
1 分色法3D成像原理[4]
3D成像技術(shù)主要有裸眼式和眼鏡式。在眼鏡式3D技術(shù)中,以色差式3D技術(shù)(Anaglyphic 3D)實(shí)現(xiàn)起來最簡(jiǎn)單,成像原理簡(jiǎn)單,使用的是濾色眼鏡,這種技術(shù)利用了有色眼鏡僅能通過相同顏色的光原理。
人們視覺上獲得的立體感,來自于左眼和右眼所看到的物體角度的細(xì)微差異,因此,必須有兩幅具有一定視差的圖像分別傳送到我們的兩眼。
分色法就需要對(duì)圖像的顏色進(jìn)行處理。圖像由像素組成,每一個(gè)像素的顏色由RGB值來表達(dá)。RGB值的R表示紅色、G表示綠色、B表示藍(lán)色,這三種顏色就是三原色,三原色中任何一種都不能用其余兩種顏色合成。RGB值的取值范圍為0~255,取值越低,其亮度就越低,因此紅色的取值范圍為(0~255,0,0)、青色(不含紅色分量的顏色)的取值范圍為(0,0~255,0~255),由于它們彼此不含有對(duì)方的顏色,對(duì)于紅藍(lán)3D而言,可以用僅有紅色分量的一幅圖(左眼視角,以下簡(jiǎn)稱左圖)和僅有綠色及藍(lán)色分量的另一幅圖(右眼視角,以下簡(jiǎn)稱右圖)合成為一幅圖,兩幅圖包含了一個(gè)畫面的完整顏色信息。
俗稱的紅藍(lán)眼鏡實(shí)際就是紅青眼鏡。紅色眼鏡只能透過圖像的紅色,青色眼鏡只能透過綠色和藍(lán)色,視覺上產(chǎn)生的兩幅圖存在角度差,因此呈現(xiàn)給我們的是一幅立體圖像,濾色原理和成像原理分別如圖1和圖2所示。
2 3D圖像合成設(shè)計(jì)方案
設(shè)計(jì)目標(biāo)是顯示一幅三維圖像的3D立體圖像,使用紅藍(lán)眼鏡觀察3D立體圖像。
開發(fā)平臺(tái):VC++ MFC及OpenGL函數(shù)庫。
VC++是基于Windows的C++開發(fā)平臺(tái),其中的MFC類庫封裝了大部分的Windows API函數(shù)。OpenGL即開放性圖形庫(Open Graphic Library),是圖形與硬件的接口,包含了圖形變換、紋理映射及特殊效果處理等120多個(gè)函數(shù),它允許開發(fā)者直接使用自己的模型數(shù)據(jù),極大地節(jié)省了開發(fā)者的時(shí)間。
實(shí)現(xiàn)方案:使用3DMax軟件建模,導(dǎo)出3ds格式的模型文件,在VC++ MFC編程環(huán)境下,讀取3ds文件,使用OpenGL[6-9]函數(shù)庫,根據(jù)3d文件數(shù)據(jù)重新恢復(fù)模型,產(chǎn)生兩幅不同視口的三維圖像并進(jìn)行顏色處理,合成一幅紅青圖像。實(shí)現(xiàn)的原理流程如圖3所示。
3 3DS文件的圖像顯示
3.1 3DMax建模
3Dmax[5]是Autodesk公司開發(fā)的基于PC系統(tǒng)的三維動(dòng)畫渲染和制作軟件,使用該軟件制作的三維模型,可以導(dǎo)出DWF或3ds格式的文件,文件包含建立模型的結(jié)構(gòu)、位置、紋理等三維數(shù)據(jù)信息,方便與其他軟件進(jìn)行交互。本文使用的是3ds格式文件,
并且以位圖文件進(jìn)行貼圖。以下是制作三維模型及導(dǎo)出3ds文件的主要流程。
⑴ 三維圖形繪制。
⑵ 給模型制定材質(zhì)或貼圖。
⑶ 導(dǎo)出3ds格式的文件。
3.2 3ds文件的讀取
3ds文件是基于“塊”存儲(chǔ)的,這些塊描述了諸如場(chǎng)景,每個(gè)視口(Viewport)的狀態(tài)、材質(zhì)、網(wǎng)格對(duì)象等數(shù)據(jù),主要涉及三個(gè)數(shù)據(jù)結(jié)構(gòu):多邊形列表、三角形列表、定點(diǎn)集。
在VC++ MFC環(huán)境下讀取3ds文件塊可以使用以下步驟。
步驟1:定義數(shù)據(jù)塊變量并分配空間。
步驟2:使用一個(gè)while循環(huán),在循環(huán)體內(nèi)讀入子塊。
步驟3:使用switch語句進(jìn)行ID號(hào)判斷及處理,如ID為MATERIAL則讀取材質(zhì)信息,ID為OBJECT則讀取對(duì)象信息等。
步驟4:若當(dāng)前字塊字節(jié)數(shù)小于預(yù)定長(zhǎng)度則結(jié)束while循環(huán)。
步驟5:釋放當(dāng)前塊的內(nèi)存空間。
3.3 三維圖形的顯示
在VC++6.0 MFC環(huán)境下,讀取3ds文件,隨后使用OPenGL庫函數(shù)實(shí)現(xiàn)圖像的顯示,在此過程中還必須進(jìn)行背景色、光源的設(shè)置,定義一個(gè)渲染函數(shù)進(jìn)行圖形的渲染,可以同時(shí)將多個(gè)3DS文件載入內(nèi)存,并賦予不同的ID標(biāo)識(shí),根據(jù)ID標(biāo)識(shí)設(shè)置各個(gè)三維模型放置的位置,可以分別對(duì)各模型進(jìn)行靈活的平移、縮放、旋轉(zhuǎn)等控制操作。
以下是一些常用OpenGL函數(shù)的功能。
⑴ glRotatef:旋轉(zhuǎn)。
⑵ glTranslatef:平移。
⑶ glClearColor:清除顏色緩沖區(qū)。
⑷ glShadeModel:設(shè)置著色模式。
⑸ glMaterialfv:指定用于光照計(jì)算的當(dāng)前材質(zhì)屬性。
4 3D立體圖像合成
以上方法實(shí)現(xiàn)了三維圖形的顯示,顯示的圖形是基于三維建模數(shù)據(jù)的二維圖像,本文使用兩個(gè)不同角度的三維圖像,圖像抓取后進(jìn)行顏色處理并重構(gòu)成3D立體圖像。
4.1 左右圖像的抓取
設(shè)計(jì)一個(gè)“3D圖像立體顯示”菜單,選擇該菜單時(shí)顯示一幅從物體左前側(cè)角度觀察的圖像,調(diào)用抓圖函數(shù)捕捉圖像,并保存為bmp[10-11]格式的位圖(左圖)文件,保存后,將圖像自動(dòng)向左旋轉(zhuǎn)一個(gè)角度,再捕捉該圖像,同樣保存為bmp格式位圖(右圖)文件。圖4是一個(gè)型號(hào)為Z35的銑床三維圖像左右兩個(gè)角度抓取的圖像。以下是圖像捕捉的實(shí)現(xiàn)步驟。
⑴ 建立一個(gè)屏幕設(shè)備環(huán)境句柄。
⑵ 建立一個(gè)與屏幕設(shè)備環(huán)境句柄兼容、與鼠標(biāo)所在窗口區(qū)域等大的位圖。
⑶ 把新位圖選到內(nèi)存設(shè)備描述表中。
⑷ 把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中。
⑸ 保存抓取的圖像。
4.2 圖像的顏色預(yù)處理
以上保存的圖像文件為24色(真彩)BMP位圖,包含了圖像的RGB全部信息,BMP文件里面的字節(jié)數(shù)據(jù)有三個(gè)部分,分別是:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、位圖數(shù)據(jù)Data Body陣列。
根據(jù)紅藍(lán)3D的成像原理,對(duì)圖像進(jìn)行濾色處理,使左圖只有紅色分量,右圖只有綠、藍(lán)兩個(gè)分量。
左圖濾色的偽代碼:
//讀入指定BMP文件進(jìn)內(nèi)存
readBmp("bmp文件名");
//獲取每行字節(jié)數(shù)
lineByte←(bmpWidth*biBitCount/8+3)/4*4;
//遍歷每像素的三個(gè)分量
bmpHeight←bmpHeight-1;
if biBitCount=24 then //24色圖像
pitch←bmpWidth%4;
for i←0 to bmpHeight
do realPitch←i*pitch;
for j←0 to bmpWidth
//只顯示紅色
do pBmpBuf1[((bmpHeight-i)*bmpWidth
+j)*3+1+realPitch] ←0;
pBmpBuf1[((bmpHeight-i)*bmpWidth
+j)*3+realPitch] ←0;
repeat
end if
代碼中,pBmpBuf1指向一段只有R分量的內(nèi)存段。以上代碼的步驟說明如下。
⑴ readBmp函數(shù)將BMP文件讀入內(nèi)存。
⑵ 求出每行字節(jié)數(shù)lineByte。代碼中的bmpWidth為是位圖的寬度,也就是每行有多少個(gè)像素塊,biBitCount是一個(gè)像素值所占的字節(jié)數(shù),對(duì)于24色位圖,此值為24。對(duì)于BMP文件,存儲(chǔ)圖像數(shù)據(jù)每行字節(jié)數(shù)為4的倍數(shù),因此求lineByte時(shí)使用“/4*4”取整,對(duì)于不滿足4的整數(shù)倍時(shí)用+3來處理。
⑶ 遍歷位圖數(shù)據(jù),對(duì)于左圖,只保留紅色分量,綠色和藍(lán)色分量設(shè)為0。
對(duì)于右圖,處理方法和左圖類似,只是保留綠色和藍(lán)色分量,定義pBmpBuf2為指向一段只有GB分量的內(nèi)存段。
4.3 左右圖像的合成
上述代碼已分別取得R分量及GB分量的圖像數(shù)據(jù),在合成一幅圖像時(shí),采用疊套的for循環(huán)遍歷每個(gè)像素的RGB分量并將像素進(jìn)行算術(shù)平均,保存到一個(gè)內(nèi)存塊中。
以下偽代碼為將R分量平均值保存到內(nèi)存塊pBmpBufhc中:
for i←0 to bmpHeight
realPitch←i*pitch; //每行像素量
for j←0 to bmpWidth
pBmpBufhc[((bmpHeight-i)*bmpWidth+j)*3+2+realPitch]
←(pBmpBuf1[((bmpHeight-i)*bmpWidth+j+offsetW)
*3+2+realPitch]+pBmpBuf2[((bmpHeight-i)
*bmpWidth+j)*3+2+realPitch])/2;
end if;
end if;
保存圖像的信息于pBmpBufhc后,將圖像保存為位圖文件,保存后的圖像可以使用一般的圖形編輯軟件打開。下面介紹的3D立體圖像的顯示中需要用到此文件。
4.4 3D立體圖像的顯示
本文使用的圖像顯示方式為讀取磁盤文件(前述中保存的文件)的方法,使用BitBlt函數(shù)顯示圖像。以下是具體步驟。
⑴ 使用MFC 的LoadImage函數(shù)裝載位圖。
⑵ 創(chuàng)建CDC對(duì)象。
⑶ 使用CreateCompatibleDC創(chuàng)建兼容設(shè)備。
⑷ 選擇位圖。
⑸ 使用BitBlt函數(shù)顯示位圖。
合成的圖像可以在一個(gè)新的窗口顯示,但在原窗口、原位置上顯示效果更好,不過需要退出原三維顯示狀態(tài),如果開啟了定時(shí)器,則需要關(guān)閉,否則圖像會(huì)出現(xiàn)嚴(yán)重的閃爍。合成的圖像如圖5所示,帶上紅藍(lán)眼鏡就可以觀看到3D立體效果。(說明:為了論文的閱讀效果,圖5的背景色作了后期處理,改為了白色,左右圖的背景色若為白色,則合成的圖像背景色為RGB(127,127,127))。
5 結(jié)束語
基于三維數(shù)據(jù)模型顯示的圖像本身并不具備3D立體效果,使用本文介紹的方法可以得到分色3D立體效果的圖像,該方法的圖像濾色與合成部分同樣適用于制作非基于三維數(shù)據(jù)的3D立體圖像,而且全過程均可直接在內(nèi)存中進(jìn)行顏色處理,速度較快,可以制作3D立體動(dòng)畫。
使用本文的方法對(duì)三維模型的靜態(tài)3D立體圖像制作有效,對(duì)于三維動(dòng)畫圖像,因?yàn)樾枰蕊@示非3D立體的圖像再進(jìn)行處理,所以不再適用。如何直接在內(nèi)存中,對(duì)3ds模型的貼圖文件進(jìn)行動(dòng)態(tài)的圖像合成,實(shí)現(xiàn)三維動(dòng)態(tài)圖像顯示的問題有待今后進(jìn)一步研究,如果這個(gè)問題得到解決,在3D立體游戲、3D立體仿真軟件開發(fā)等方面將有廣泛的應(yīng)用前景。
參考文獻(xiàn)(References):
[1] 孫俊麗.基于新一代信息技術(shù)的photoshop圖像處理課程開發(fā)與建設(shè)[J].辦公自動(dòng)化,2018.2:61-62
[2] 劉鳳霞.基于photoshop圖層混合計(jì)算公式的應(yīng)用探究[J].電腦編程技巧與維護(hù),2018.3:126-127,163
[3] 張曉琪.PhotoShop圖層的應(yīng)用技巧[J].電腦編程技巧與維護(hù),2017.18:84-86
[4] 王少典.關(guān)于3D顯示的研究與應(yīng)用前景[J].信息記錄材料,2018.3:91-93
[5] 冉秋.3DMAX三維虛擬基礎(chǔ)下景觀設(shè)計(jì)技術(shù)的分析[J].數(shù)字技術(shù)與應(yīng)用,2017.1:153,157
[6] 袁觀娜,李秋,張琰.基于OpenGL與3Dmax的虛擬現(xiàn)實(shí)動(dòng)作仿真系統(tǒng)的研究[J].科技資訊,2016.4:1-2
[7] 許玉龍,張佩江,王忠義等.基于MFC和OpenGL的虛擬人體經(jīng)絡(luò)穴位模型實(shí)現(xiàn)方法[J].計(jì)算機(jī)與現(xiàn)代化,2018.3:6-12
[8] 張肇同.基于opengl的三維模型讀取與動(dòng)態(tài)觀察[J].科技視界,2017.34:4-5
[9] 梁婧,姚紅革.基于OpenGL的三維建??梢暬浖_發(fā)[J].信息通信,2013.9:83-83
[10] 趙劉飛,趙敏華.VC中DIB位圖程序設(shè)計(jì)的研究[J].工業(yè)控制計(jì)算機(jī),2014.3:41-42,45
[11] 肖峰.VC++下的BMP格式圖像和PNG格式圖像的轉(zhuǎn)換[J].赤峰學(xué)院學(xué)報(bào):自然科學(xué)版,2016.3:17-18