利用opencv对图像数据处理的快捷性和MFC全面的界面显示,可以很好的对图片进行处理并形成属于自己的图像处理程序界面。两者结合还是有很大的优势的。
opencv的IplImage图像结构使用方便,并且具有强大的解码功能。对得到的图像数据进行处理后,封装成BMP图片结构,利用MFC的函数进行显示。
//图像数据指针
unsigned char *m_pImgData;
//图像颜色表指针
LPRGBQUAD m_lpColorTable;
//每像素占的位数,此处使用24bits,不用颜色板
int m_nBitCount;
//private:
//指向DIB的指针(包含BITMAPFILEHEADER、BITMAPINFOHEADER和颜色表)
LPBYTE m_lpDib;
//图像信息头文件
LPBITMAPINFOHEADER m_lpBmpInfoHead;
//调色板句柄
HPALETTE m_hPalette;
//颜色表长度 为24
int m_nColorTableLength;
//图像的宽,像素为单位
int m_imgWidth;
//图像的高,像素为单位
int m_imgHeight;
BOOL CImgCenterDib::ShowIplImg(IplImage*Img,CDC*pDC)
{
int i,j;
m_imgHeight=Img->height;
m_imgWidth=Img->width;
BITMAPFILEHEADER bmfh;//BMP文件头
bmfh.bfType = 0x4d42; // 'BM'
bmfh.bfSize = 0;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength;
if(m_lpBmpInfoHead!=NULL)
delete[]m_lpBmpInfoHead;
m_lpBmpInfoHead=new BITMAPINFOHEADER [sizeof(BITMAPINFOHEADER)];//BMP文件信息头
m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER);
m_lpBmpInfoHead->biWidth = Img->width;
m_lpBmpInfoHead->biHeight = Img->height;
m_lpBmpInfoHead->biPlanes = 1;
m_lpBmpInfoHead->biBitCount =m_nBitCount;
m_lpBmpInfoHead->biCompression = BI_RGB;
m_lpBmpInfoHead->biSizeImage = 0;
m_lpBmpInfoHead->biXPelsPerMeter = 0;
m_lpBmpInfoHead->biYPelsPerMeter = 0;
m_lpBmpInfoHead->biClrUsed = m_nColorTableLength;
m_lpBmpInfoHead->biClrImportant = m_nColorTableLength;
int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;
//位图数据的大小
int imgBufSize=m_imgHeight*lineByte;
//为m_lpDib重新分配空间,以存放新的DIB
if(m_lpDib!=NULL)
delete[]m_lpDib;
m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *m_nColorTableLength+imgBufSize];
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * m_nColorTableLength;
for(i=0;i<m_imgHeight;i++)
{
for(j=0;j<lineByte;j++)
{
if(j<m_imgWidth*3)
m_pImgData[i*lineByte+j]=Img->imageData[(m_imgHeight-1-i)*Img->width*3+j];
else
m_pImgData[i*lineByte+j]=0x00;
}
}//将IplImage数据传递给BMP文件,以BMP文件形式进行显示。
CSize sizeFileDib=GetDimensions();
Draw(pDC,CPoint(0,0),sizeFileDib);
return TRUE;
}
<pre name="code" class="csharp">BOOL CImgCenterDib::Draw(CDC* pDC, CPoint origin, CSize size)
{
//旧的调色板句柄
HPALETTE hOldPal=NULL;
//如果DIB为空,则返回0
if(m_lpDib == NULL)
return FALSE;
//如果DIB有调色板
if(m_hPalette != NULL)
{
//将调色板选进设备环境中
hOldPal=::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);
//实现调色板
pDC->RealizePalette();
}
//设置位图伸缩模式
pDC->SetStretchBltMode(COLORONCOLOR);
//将DIB在pDC所指向的设备上进行显示
::StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,
0, 0, m_lpBmpInfoHead->biWidth, m_lpBmpInfoHead->biHeight,m_pImgData,
(LPBITMAPINFO) m_lpBmpInfoHead, DIB_RGB_COLORS, SRCCOPY);
//恢复旧的调色板
if(hOldPal!=NULL)
::SelectPalette(pDC->GetSafeHdc(), hOldPal, TRUE);
//函数返回
return TRUE;
}