OpenCV IplImage和GDI+ Bitmap的相互转换

IplImage和Bitmap都是内存图形的表示方法,前者是OpenCV开源视觉库的,后者是GDI+的。如果在VC中使用OpenCV库的话,很可能会用到这两者的转换。

在网上搜索这两种格式转换的话,很有可能会搜索到有内存泄露的版本(比如 http://blog.csdn.net/jtujtujtu/article/details/3734722),因此在此提供了没有内存泄露的版本供大家参考。

【注意】使用GDI+的FromBITMAPINFO函数会导致内存泄露!

  1. IplImage* Bitmap2IplImage(Bitmap* pBitmap)  
  2. {  
  3.     if (!pBitmap)  
  4.         return NULL;  
  5.    
  6.     int w = pBitmap->GetWidth();  
  7.     int h = pBitmap->GetHeight();  
  8.    
  9.     BitmapData bmpData;  
  10.     Rect rect(0,0,w,h);  
  11.     pBitmap->LockBits(&rect, ImageLockModeRead, PixelFormat24bppRGB, &bmpData);  
  12.     BYTE* temp = (bmpData.Stride>0) ? ((BYTE*)bmpData.Scan0) : ((BYTE*)bmpData.Scan0 + bmpData.Stride*(h-1));  
  13.    
  14.     IplImage* pIplImg = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3);  
  15.     if (!pIplImg)  
  16.     {  
  17.         pBitmap->UnlockBits(&bmpData);  
  18.         return NULL;  
  19.     }  
  20.    
  21.     memcpy(pIplImg->imageData, temp, abs(bmpData.Stride)*bmpData.Height);  
  22.     pBitmap->UnlockBits(&bmpData);  
  23.    
  24.     //判断Top-Down or Bottom-Up  
  25.     if (bmpData.Stride<0)  
  26.         cvFlip(pIplImg, pIplImg);  
  27.    
  28.     return pIplImg;  
  29. }  
  1. // pBitmap 同样需要外部释放  
  2. Bitmap*  IplImage2Bitmap(IplImage* pIplImg)  
  3. {  
  4.     if(!pIplImg)  
  5.         return NULL;  
  6.    
  7.     Bitmap *pBitmap = new Bitmap(pIplImg->width, pIplImg->height, PixelFormat24bppRGB);  
  8.     if (!pBitmap)  
  9.         return NULL;  
  10.    
  11.     BitmapData bmpData;  
  12.     Rect rect(0, 0, pIplImg->width, pIplImg->height);  
  13.     pBitmap->LockBits(&rect, ImageLockModeWrite, PixelFormat24bppRGB, &bmpData);  
  14.     BYTE *pByte = (BYTE*)bmpData.Scan0;  
  15.    
  16.     if (pIplImg->widthStep == bmpData.Stride) //likely  
  17.         memcpy(bmpData.Scan0, pIplImg->imageDataOrigin, pIplImg->imageSize);  
  18.    
  19.     pBitmap->UnlockBits(&bmpData);  
  20.     return pBitmap;  
  21. }  


转自:http://www.leewei.org/?p=1009

posted @ 2016-04-28 21:30  何人之名  阅读(1370)  评论(0)    收藏  举报