何杰 王大立 袁紅 姜國平
摘 要:OpenGL和OpenCV特有開源庫函數(shù)被用于圖像變換,顯示了高效、便捷性。文章面向紋理貼圖應(yīng)用,對位圖文件結(jié)構(gòu)進行了詳盡解析;依據(jù)圖像顏色點陣數(shù)據(jù),用C++結(jié)合OpenCV編寫了位圖鏡像變換程序。通過調(diào)用OpenCV庫函數(shù),所編鏡像變換程序代碼更簡單,功能更完備,不僅可被用于處理*.bmp格式圖片,還能被用于處理*.jpg, *.png, *.webp, *.pbm, *.pgm, *.sr, *.ras, *.tiff, *.tif等格式圖片。基于OpenCV函數(shù)庫,易于快速編程實現(xiàn)各種圖像變換且效果較好,為進一步應(yīng)用研究打下了基礎(chǔ)。
關(guān)鍵詞:圖形學編程;鏡像;像素讀寫;位圖;OpenCV;化工仿真;虛擬現(xiàn)實
0? ? 引言
實際物體表面有豐富紋理,要繪制逼真的3D物體,除光照處理外,還要給其表面附上紋理特征,用到“紋理貼圖”技術(shù)[1-2]。OpenGL(Open Graphics Library)是被用于渲染2D、3D矢量圖形、跨語言、跨平臺的應(yīng)用程序編程接口,常被用于CAD、虛擬現(xiàn)實、科學可視化程序和電游開發(fā)。其關(guān)聯(lián)軟件有很好的移植性。簡單說,OpenGL與硬件無關(guān),獨立于操作系統(tǒng),支持網(wǎng)絡(luò)運行。OpenCV(Open Source Computer Vision Library)廣受歡迎,源代碼開放,可被用于開發(fā)實時圖像處理、計算機視覺及模式識別程序,在工業(yè)界及科研領(lǐng)域被廣泛采用。OpenGL提供了位圖操作函數(shù)。利用其紋理映射功能可以十分逼真地表達物體表面細節(jié)[3-5]。利用OpenCV函數(shù)庫,可以較好地實現(xiàn)各種格式圖片空間幾何、色彩、明暗等變換操作[6]。
尹航等[7]討論了在VS2005環(huán)境下借助OpenGL和第三方庫CxImage(圖像操作類庫),利用PNG圖片進行紋理映射。袁亮等[1]為了實現(xiàn)二次曲面紋理映射,在分析OpenGL紋理映射技術(shù)的基礎(chǔ)上,詳細討論了球形曲面紋理坐標生成和設(shè)置;然后,利用OpenGL函數(shù)庫,在VC++環(huán)境下,實現(xiàn)了雷達天線罩迷彩紋理貼圖。薛兆井? ?等[3]研究了基于OpenGL讀取bmp圖像實現(xiàn)紋理映射的一種新方法。韓姣[8]探討了在VC++環(huán)境下bmp與gif圖像文件格式轉(zhuǎn)換,編程實現(xiàn)了bmp圖像讀取、顯示和保存等相關(guān)操作。文章面向紋理貼圖應(yīng)用,探討了圖像鏡像變換圖形學編程技術(shù)。
1? ? Bitmap-file解析
用WinHex查看一24-bit Bitmap file(圖1),知它每行? ?420 pixels(width)×3 Bytes/pixel=1 260 Bytes,能被4整除,不用進行補位。對此圖變換無須考慮這些無效或冗余填充數(shù)據(jù)。本Bitmap file總大小為420 pixels(寬)*534 pixels(高)*3 Bytes/pixel+14 Bytes(size of bitmap-file header)+? ? 40 Bytes(size of bitmap-information header)+2(Photoshop圖像整體補位) =672 896 Bytes,或672 896 Bytes/1 024 Bytes/KB≈657 KB。圖像大小為672 837/3+1 =224 280 pixels=? ? ? ? 420 pixels(寬)*534 pixels(高)。
2? ? 位圖鏡像變換機理與編程實現(xiàn)
如圖2所示,其像素數(shù)據(jù)寫入順序統(tǒng)一為“左右下上”。區(qū)別是像素數(shù)據(jù)讀取次序,對于原圖輸出,其順序是“左右下上”,而對于鏡像變換,為“右左下上”?;蛘哒f,其逐行像素信息被左右對換了。按一定次序,程序首先提取源圖右下角單元格數(shù)據(jù),寫入鏡像圖左下角單元格內(nèi),以此類推。表達式“bmpImg->imageData[i * width * 3 + j * 3 + k] = pixVal;”引用了指針bmpImg指向的結(jié)構(gòu)體IMAGE成員imageData。
3? ? OpenCV應(yīng)用實例
應(yīng)用C++結(jié)合OpenCV混合編程(Win7_64-bit System,VS2019+OpenCV4.3.0)可以更方便地對圖片進行鏡像變換。其變換機制與程序注解如下:
3.1? 讀取圖像
Mat src = imread(“kneader.jpg”, CV_LOAD_IMAGE_UNCHANGED); Imread( )函數(shù)經(jīng)常與imshow(“src”, src); 配合使用??梢岳斫釳at為一個數(shù)據(jù)存儲容器,定義了一個src對象來存儲圖像數(shù)據(jù)。Mat類能夠自動管理內(nèi)存。
3.2? 創(chuàng)建矩陣
inline void Mat::create(Size _sz, int _type)Mat類是一個矩陣圖像類,由兩部分組成:矩陣頭,包含矩陣尺寸、存儲方法、存儲地址等信息,和一個指向存儲圖像中所有像素的矩陣體。例如,“cv::Mat dstImg;”僅創(chuàng)建了圖像矩陣信息頭部分,并未創(chuàng)建矩陣體。因此,cv::Mat::create( )函數(shù)作用就很清楚了,創(chuàng)建一個指定大小(Size),指定類型type(CV_8UC1, CV_16SC1, CV_32FC3)的圖像矩陣體。
3.3? 鏡像生成
for ( init; condition; increment ) {? statement(s); }鏡像生成主代碼被包含在C++ for循環(huán)內(nèi),如圖2所示。鏡像變換基本機制是,保持兩圖像素橫坐標值不變,縱坐標值次序發(fā)生順逆轉(zhuǎn)化。Mat類提供了一個at方法,SrcImage.at
3.4? 像素重映射
remap(src, dst, map_x, map_y, CV_INTER_LINEAR); 圖像坐標映射關(guān)聯(lián)有兩種,一種是計算源圖任意像素在映射后圖像坐標位置,另一種是計算變換后圖像任意像素被反映射在源圖坐標位置。重映射就是把一圖中某位置像素“放置”到另一圖指定位置的過程。為了完成重映射有必要獲得一些插值作為非整數(shù)像素坐標,因為源圖、目標圖像素坐標非一一對應(yīng)。通過重映射來表達每個像素新位置g(x,y),滿足g(x,y)=f(h(x,y))。h(x,y)是作用于(x,y)的映射方法函數(shù)。最后,用imshow( )顯示圖像;用waitkey(0)使圖像顯示保持,而非一閃而過。
4? ? 結(jié)語
紋理映射能極大地提高虛擬物體真實感。為使化工仿真更真實,可以將實物圖用作紋理圖。在對bmp圖及其他格式圖像變換方面,本研究主要內(nèi)容、結(jié)論有:
(1)用WinHex查閱了一例圖Bitmap-file,解析了Bitmap-file數(shù)據(jù)、結(jié)構(gòu)。明確了Bitmap像素點與Bitmap-file中像素點陣數(shù)據(jù)一一對應(yīng)關(guān)系?;趫D像顏色點陣數(shù)據(jù),用Visual Studio 2013中Visual C++結(jié)合OpenGL編寫了位圖鏡像生成程序;
(2)基于位圖像素數(shù)據(jù)讀寫函數(shù)fread與fwrite,設(shè)計了特定像素數(shù)據(jù)讀寫順序,實現(xiàn)了位圖鏡像變換;
(3)在Microsoft Visual C++編譯環(huán)境下,采用OpenCV計算機視覺庫混合編程,高效、便捷實現(xiàn)了圖像鏡像變換;
(4)紋理映射可以賦予化工設(shè)備、管道、框架、廠房、場景真實感,運用圖形學編程對各種實物圖片進行靈活變換有利于更好地應(yīng)用紋理映射。
[參考文獻]
[1]袁亮,張兵,李廣強.OpenGL二次曲面紋理映射技術(shù)分析與應(yīng)用[J].空軍雷達學院學報,2009(5):376-378.
[2]唐聰.基于OpenGL的三維場景可視化仿真[D].西安:西安電子科技大學,2013.
[3]薛兆井,胡平平.基于OpenGL讀取bmp實現(xiàn)紋理映射的方法[J].軍民兩用技術(shù)與產(chǎn)品,2009(9):40-41.
[4]趙方,張軍和,彭亞雄.基于OpenGL紋理映射反走樣技術(shù)的研究[J].電腦知識與技術(shù),2011(17):4160-4161,4164.
[5]吳發(fā)輝,張玲,余文森.基于圖形學算法的紋理映射技術(shù)的研究與實現(xiàn)[J].現(xiàn)代電子技術(shù),2018(24):71-74.
[6]趙浩杰,金德智,李彥杰.基于OpenCV的彩色目標識別[J].中國科技信息,2016(2):36-37.
[7]尹航,李義杰,孫健超.基于OpenGL的PNG紋理映射的實現(xiàn)[J].計算機系統(tǒng)應(yīng)用,2009(7):182-185.
[8]韓姣.基于VC++的BMP格式圖像與GIF格式圖像轉(zhuǎn)換 [J].武漢理工大學學報(信息與管理工程版),2007(12):23-25,30.
(編輯 王雪芬)