999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

GDI+與OpenCV在編程中混合使用的研究

2015-09-18 05:54:02吳東謝國波蘇本卉
現代計算機 2015年13期
關鍵詞:方法

吳東,謝國波,蘇本卉

(1.中山大學附屬第一醫院繼續教育科,廣州510080;2.廣東工業大學計算機學院,廣州510006)

GDI+與OpenCV在編程中混合使用的研究

吳東1,謝國波2,蘇本卉2

(1.中山大學附屬第一醫院繼續教育科,廣州510080;2.廣東工業大學計算機學院,廣州510006)

介紹兩種常用圖像接口GDI+和OpenCV的特點以及功能,主要闡述在Visual Studio開發環境中使用GDI+和OpenCV結合混合使用處理圖像的思路并使用代碼實現。示例已通過上機調試,并投入實際使用。

GDI+;OpenCV;混合;圖像

0 引言

OpenCV是一個基于(開源)發行的跨平臺計算機視覺庫,針對2D、3D圖像的處理提供了豐富的處理方法,主要應用于物體識別、圖象分割、人臉識別、動作識別、運動跟蹤、運動分析、機器視覺等領域,開發效率比較高,常常是我們在實際應用中處理圖像的首選[1]。而GDI+是微軟提供的一種圖形設備接口,主要用于2D圖像的繪制,其繪制圖形的功力非常強大。雖然圖像實際應用中我們主要使用OpenCV進行開發,但是一些細節地方難免需要用到GDI+的繪制功能,例如對一些圖片處理之后,需要在每張圖片上寫漢字。前面的圖像處理我們可使用OpenCV來完成,但是寫漢字就需要GDI+來完成。這就需要用到OpenCV和GDI+來混合使用,而混合使用的關鍵就是二者格式的轉化。

1 GDI+與OpenCV圖片格式轉換原理的分析

GDI+與OpenCV圖像類型的轉換是GDI+與OpenCV混合使用的關鍵,我們可以對GDI+與OpenCV表示圖像的類型的結構和方法進行分析。

GDI+共包括三個圖像類:Image類、Bitmap類和Metafile類,其Metafile類主要用于處理矢量圖(不屬于本文討論范圍),Bitmap類主要表示光柵圖,Image是二者的父類。OpenCV中主要使用IplImage結構體來創建和處理圖像,所以只需討論Bitmap與IplImage兩種格式并實現兩種格式的轉換即可。

由于GDI+與OpenCV不存在強制互轉,所以我們就采用另一種常用的轉換圖像格式的方法:就是把Bitmap或IplImage類型圖像轉換為Byte數據[2],然后構造空白的Bitmap或IplImage類型的圖片,再把byte數據填充到該空白圖像中即可。

1.1Bitmap到Byte的轉換

把Bitmap轉換為二進制會用到BitmapData這個類,使用BitmapData可以讀取圖片信息在內存中的地址,BitmapData類中的Scan0表示圖片第0個像素的第0個分量在內存的地址,BitmapData中Stride表示圖片一行像素的字節寬度,根據圖片的原點坐標位置的不同可正可負。Windows系統的窗口坐標原點為左上角,所以圖片在內存中存放時順序是從左到右,從上到下,但當圖片在窗口中顯示時卻有兩種坐標。

若圖片的原點坐標與Windows相同在左上角,如圖1,則Sride為正數,此時Scan0表示圖1中像素點a的地址,讀取順序是從左到右,從上到下,即a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p。

若圖片坐標原點在左下角,則像素點的順序如圖2,則此時Stride為負數,此時Scan0表示圖1中像素點a的地址,由于memcpy方法拷貝數據是按照內存中存儲順序進行的,而此時圖片像素點在內存中保存的順序為m、n、o、p、i、j、k、l、e、f、g、h、a、b、c、d,所以應調節讀取起始點a到m,讀取方式是從左到右,最先讀取圖像的最后一行。讀取信息后的圖片為原圖片關于x軸的反轉圖片,所以最后用OpenCV中cvFilp方法來再次反轉圖片,以得到圖片的正確顯示效果。

圖1 原點在左上角時像素位置

圖2 原點在左上角時像素位置

1.2Ipllmage到Byte的轉換

IplImage轉Byte相對于上面來說比較簡單,IplImage結構中有imageDataOrigin和imageSize兩個參數,其中imageDataOrigin表示圖像數據的起始地址,imageSize表示數據的長度,用memcpy方法即可拷貝數據成Byte類型。

1.3Byte到Ipllmage的轉換:

IplImage結構中存在imageData變量,表示IplImage類型圖像的數據。我們可以先用cvCreateImage方法創建一個和要轉換的Bitmap類型的圖片長寬一樣的空白圖像,然后求出Byte中數據的長度,用memcpy方法從Byte拷貝數據到imageData。最后根據Bitmap圖像原點坐標的位置,判斷是否需要用IplImage的方法從cvFlip反轉圖像。

1.4Byte到Ipllmage的轉換

Byte到Bitmap同樣需要借組BitmapData,Bitmap中讀寫數據時需用LockBits來鎖定讀寫區域,并且LockBits方法中包含BitmapData類型的參數,作用是保存要讀寫的數據,而BitmapData可強轉為Byte類型,所以我們只需先新建一個Bitmap類型指針,鎖定Bitmap指針對象,關聯BitmapData對象,最后用memcpy方法拷貝Byte數據到BitmapData對象的Scan0變量中。

2 GDI+與OpenCV在編程中混合使用的實現

2.1GDI+與OpenCV類型呼轉函數的實現

Bitmap*轉IplImage*代碼實現:

Ip lImage*BitmapToIplImage(Bitmap*pBitmap)

{

if(pBitmap)

{

BitmapData bmpData;

Rect rect(0,0,pBitmap->GetW idth(),pBitmap->GetH-eight());

pBitmap->LockBits(&rect,ImageLockModeRead,PixelFormat24bppRGB,&bmpData);

BYTE*temp=NULL; If(bmpData.Stride>0)

temp=(BYTE*)bmpData.Scan0;

else

temp=(BYTE*)bmpData.Scan0+bmpData.Stride* (pBitmap->GetHeight()-1);

IplImage*p IplImg=cvCreateImage(cvSize(pBitmap-> GetWidth(),pBitmap->GetHeight()),IPL_DEPTH_8U,3);

if(!p Ip lImg)

{

pBitmap->UnlockBits(&bmpData);

return NULL;

}

memcpy(pIplImg->imageData,temp,abs(bmpData. Stride)*bmpData.Height);

pBitmap->UnlockBits(&bmpData);

if(bmpData.Stride<0)

cvFlip(pIplImg,NULL,0);

return pIplImg;

}

else

return NULL;

}

函數思路過程:首先判斷圖像是否存在,新建對象bmpData保存Bitmap圖像數據信息,LockBits鎖定整個Bitmap中數據位置,然后讀取到temp中。創建lplImage對象pIplImg,把temp中數據拷貝到pIplImg中并解鎖pBitmap,最后返回填充好的lplImage圖片指針。

IplImage*轉Bitmap*代碼實現:

Bitmap*IplImageToBitmap(IplImage*p Ip lImg)

{

if(p IplImg)

{

Bitmap*pBitmap=new Bitmap(pIplImg->width,p I-plImg->height,PixelFormat24bppRGB);

if(!pBitmap)

return NULL;

BitmapData bmpData;

Rect rect(0,0,p IplImg->width,p IplImg->height);

pBitmap->LockBits(&rect,ImageLockModeWrite,PixelFormat24bppRGB,&bmpData);

BYTE*pByte=(BYTE*)bmpData.Scan0;

if(p IplImg->widthStep==bmpData.Stride)//likely

memcpy(bmpData.Scan0,p IplImg->imageDataO-rigin,p IplImg->imageSize);

pBitmap->UnlockBits(&bmpData);

return pBitmap;

}

else

return NULL;

}

函數思路過程:首先判斷圖像是否存在,然后用new方法新建一個長寬和要轉換的IplImage圖像相等的Bitmap圖像,使用LockBits方法是為了鎖定整個Bitmap中數據位置然后等待數據的填充。memcpy用于拷貝填充bmpData,Scan0表示數據矩陣在內存中的地址,imageDataOrigin表示IplImage類型圖片中數據的起始位置,imageSize表示數據的長度,把IplImage中數據拷貝到Bitmap中后用UnlockBits解鎖區域,最后返回填充好的Bitmap圖片指針。

2.2互轉函數的測試

本測試主要是驗證圖片類型互轉后可不可以正確使用轉換后的圖片指針,測試中使用顯示圖片這個功能進行驗證。

首先,用IplImage類型載入C盤下的圖片test.jpg,然后用IplImageToBitmap函數把IplImage圖片轉為Bitmap類型,然后用Draw Image函數顯示圖片,代碼如下:

CDC*pDC=GetDC();

Graphics graph(pDC->GetSafeHdc());

IplImage*pImage=cvLoad Image("c:\test.jpg",1);

Bitmap*img=IplImageToBitmap(p Image);

graph.DrawImage(img,0,0);

程序執行完后可得結果(下圖):

圖3 轉換后結果

然后,用Bitmap類型載入C盤下的圖片test.jpg,然后用BitmapToIplImage函數把Bitmap圖片轉為I-plImage類型,調OpenCV的cvShow Image函數顯示圖片,代碼如下:

CDC*pDC=GetDC();

Bitmap*img=Bitmap::FromFile(L"c:\test.jpg");

IplImage*p Image=BitmapToIplImage(img);

cvShowImage("圖片",pImage);

程序執行完后可得結果(圖4)。

2.3測試結論

由以上測試可知,GDI+和OpenCV中主要的圖片類Bitmap和IplImage類型相互轉換后均能正確地顯示圖片,即在實際的開發應用過程中可以針對不同情況靈活地選擇其一進行使用,大大提高了代碼的靈活性和編程效率。

圖4 轉換后結果

3 結語

GDI+與OpenCV都具有豐富的圖像操作及處理方法,實際操作中可能會反復用到兩個庫的轉換,本文提供的算法能夠方便地實現它們各自支持的類型的轉換,不需要去保存中間圖像數據,可以使用戶能夠方便地在實際應用中根據需要結合二者各自的長處來設計程序,使得圖像處理的工作變得事半功倍。

[1]左飛.數字圖像處理技術詳解與Visual C++實踐.北京:電子工業出版社.2014(3):157~242

[2]高守傳,劉書志,姚領田等.VC++實踐與提高——數字圖像處理與工程應用篇.北京:中國鐵道出版社.2006(1):5~17

[3]劉瑞楨,于仕琪.OpenCV教程——基礎篇.北京:北京航空航天出版社,2007:76~385

[4]Chand M.GDI+圖形程序設計.北京:電子工業出版社,2005:1~325

GDI+;OpenCV;Mixed;Images

Research on the Mixed Use of GDI+and OpenCV in Programm ing

WU Dong1,XIE Guo-bo2,SU Ben-hui2

(1.Department of Education,the First Affiliated Hospital of SUN Yat-sen University,Guangzhou 510080;2.College of Computer,Guangdong University of Technology,Guangzhou 510006)

Introduces the two common interface of GDI+and OpenCV image features and functions,mainly elaborates the idea of using GDI+and OpenCV mixing processing image in the Visual Studio development environment and then implementing code.The example has passed the debugging and put in actual application.

1007-1423(2015)16-0082-04

10.3969/j.issn.1007-1423.2015.16.019

吳東(1974-),男,海南人,本科,研究實習員,研究方向為信息化管理

謝國波(1977-),男,廣東五華人,博士,教授,研究方向為云計算與大數據、混沌保密通信、低碳制造數據智能化處理

蘇本卉(1991-),男,河南安陽人,碩士研究生,研究方向為混沌保密通信

2015-04-07

2015-05-15

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 久久这里只精品热免费99| 国产成人一区在线播放| 性色在线视频精品| 精品人妻系列无码专区久久| 91精品久久久久久无码人妻| 在线欧美日韩国产| 日韩精品无码免费一区二区三区| 欧美高清国产| 亚洲精品你懂的| 国产精品爽爽va在线无码观看 | 亚洲中文字幕无码mv| 97一区二区在线播放| 国产在线观看人成激情视频| 欧美精品1区| 自拍偷拍欧美日韩| 欧美成人综合在线| 国产18页| 国产一区在线观看无码| 秋霞一区二区三区| 亚洲欧洲日韩久久狠狠爱| 国产亚洲欧美在线中文bt天堂| 亚洲免费成人网| 波多野结衣久久高清免费| 精品亚洲麻豆1区2区3区 | 国产另类视频| 久久毛片网| 精品伊人久久久大香线蕉欧美| 欧美一级在线| 国产精品视频免费网站| 中字无码av在线电影| 色婷婷国产精品视频| 国产福利微拍精品一区二区| 精品久久久久无码| 日本不卡免费高清视频| 亚洲二三区| 九九免费观看全部免费视频| 欧美成人一区午夜福利在线| 精品一区二区三区波多野结衣| 999国产精品| 91视频精品| 亚洲精品午夜天堂网页| 亚洲中久无码永久在线观看软件 | 国产美女免费| 园内精品自拍视频在线播放| 久久久亚洲色| 免费一极毛片| 亚洲天堂久久新| 激情亚洲天堂| 国产 在线视频无码| 91人妻日韩人妻无码专区精品| 青青青视频91在线 | 97精品国产高清久久久久蜜芽| 91精品国产91久无码网站| 日本a∨在线观看| 五月婷婷丁香色| 一级成人欧美一区在线观看 | 色婷婷综合激情视频免费看| 亚洲va精品中文字幕| 日韩欧美国产中文| 永久免费无码日韩视频| 精品无码日韩国产不卡av| 国产亚洲高清在线精品99| 日韩欧美国产三级| 欧美亚洲网| 国产精品国产三级国产专业不| 欧美久久网| 久久中文无码精品| 女人18毛片一级毛片在线 | 四虎永久在线精品影院| 国产精品自在线拍国产电影| 成AV人片一区二区三区久久| 国产精品亚洲一区二区三区z| 99青青青精品视频在线| 黄色污网站在线观看| 99热这里都是国产精品| 五月天在线网站| 国模沟沟一区二区三区| 国产午夜一级毛片| 国产极品美女在线播放| 伊人欧美在线| 国产亚洲欧美日韩在线一区二区三区| 成人午夜久久|