打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
opencv-Win32下HBITMAP格式图像 Convert to为opencv下 IplImage

opencv-Win32下HBITMAP格式图像 Convert to为opencv下 IplImage



// hbitmap convert to IplImage
IplImage* hBitmapToIpl(HBITMAP hBmp)
{
BITMAP bmp;
GetObject(hBmp,sizeof(BITMAP),&bmp);

// get channels which equal 1 2 3 or 4
// bmBitsPixel :
// Specifies the number of bits
// required to indicate the color of a pixel.
int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;

// get depth color bitmap or grayscale
int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;


// create header image
IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight),depth,nChannels);

// allocat memory for the pBuffer
BYTE *pBuffer = new BYTE[bmp.bmHeight*bmp.bmWidth*nChannels];

// copies the bitmap bits of a specified device-dependent bitmap into a buffer
GetBitmapBits(hBmp,bmp.bmHeight*bmp.bmWidth*nChannels,pBuffer);

// copy data to the imagedata
memcpy(img->imageData,pBuffer,bmp.bmHeight*bmp.bmWidth*nChannels);
delete pBuffer;

// create the image
IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,3);
// convert color
cvCvtColor(img,dst,CV_BGRA2BGR);
cvReleaseImage(&img);
return dst;
}  

 IplImage TO HBITMAP 

HBITMAP hbmp=CreateDIBitmap(pdc->GetSafeHdc(),bmih,CBM_INIT,ipg_src->imageData,bmi,DIB_RGB_COLORS);

  这里千万万千要注意的是第一个参数,一定是要将图片显示的设备的句柄,null表示内存。

  最后:m_pBitmap->Attach(hBitmap);完事大吉,当然如果加一个

  if(m_pBitmap->m_hObject!=NULL)

  {

  m_pBitmap->Detach();

  }更好。


void createDIB(IplImage* &pict){
IplImage * Red=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U, 1 );
IplImage * Green=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U, 1 );
IplImage * Blue=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U, 1 );
cvSetImageCOI( pict, 3);
cvCopy(pict,Red);
cvSetImageCOI( pict, 2);
cvCopy(pict,Green);
cvSetImageCOI(pict, 1);
cvCopy(pict,Blue);
//Initialize the BMP display buffer
bmi = (BITMAPINFO*)buffer;
bmih = &(bmi->bmiHeader);
memset( bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = IMAGE_WIDTH;
bmih->biHeight = IMAGE_HEIGHT; // -IMAGE_HEIGHT;
bmih->biPlanes = 1;
bmih->biCompression = BI_RGB;
bmih->biBitCount = 24;
palette = bmi->bmiColors;
for( int i = 0; i < 256; i++ ){
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed =(BYTE)i;
palette[i].rgbReserved = 0;
}
cvReleaseImage(&Red);
cvReleaseImage(&Green);
cvReleaseImage(&Blue);
}



IplImage 与 CBitmap类 的相互转换

1 IplImage转换为CBitmap类型

CBitmap *IplImage2CBitmap(const IplImage *pImage)
{
if( pImage && pImage->depth == IPL_DEPTH_8U )
{
HDC hDC=GetDC(NULL);
uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
BITMAPINFO* bmi = (BITMAPINFO*)buffer;
int bmp_w = pImage->width, bmp_h = pImage->height;
FillBitmapInfo( bmi, bmp_w, bmp_h, pImage->depth*pImage->nChannels, pImage->origin );

char *pBits=NULL;
HBITMAP hBitmap=CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,(void**)&pBits,NULL,0);
memcpy(pBits,pImage->imageData,pImage->imageSize);
CBitmap *pBitmap=new CBitmap;
pBitmap->Attach(hBitmap);

return pBitmap;
}
else
return NULL;
}

void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
{
assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));

BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);

memset( bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = origin ? abs(height) : -abs(height);
bmih->biPlanes = 1;
bmih->biBitCount = (unsigned short)bpp;
bmih->biCompression = BI_RGB;

if( bpp == 8 )
{
RGBQUAD* palette = bmi->bmiColors;
int i;
for( i = 0; i < 256; i++ )
{
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
palette[i].rgbReserved = 0;
}
}
}

2 CBitmap转换为IplImage类型

IplImage *CBitmap2IplImage(const CBitmap *pBitmap)
{
DIBSECTION ds;
pBitmap->GetObject(sizeof(ds),&ds);
IplImage *pImage=cvCreateImage(cvSize(ds.dsBm.bmWidth,ds.dsBm.bmHeight),8,ds.dsBmih.biBitCount/8);
memcpy(pImage->imageData,ds.dsBm.bmBits,pImage->imageSize);
return pImage;
}


3.HBITMAP 转换为IplImage

IplImage* hBitmap2Ipl(HBITMAP hBmp)
{

BITMAPbmp;
::GetObject(hBmp,sizeof(BITMAP),&bmp);
intnChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;
int depth =bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;
IplImage*img = cvCreateImage( cvSize(bmp.bmWidth, bmp.bmHeight), depth,nChannels);
//img->imageData =(char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
returnimg;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Bitmap与IplImage之间的转换
CImageList图像列表控件
OpenCV中IplImage 与 Gdiplus 中Bitmap之间的相互转换
CBitmap和HBITMAP的区别及相互转换方法
mfc中图片大小怎么调整啊?
在OpenCV2.2中使用CvvImage类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服