在Windows应用程序中将Mat转换为位图

时间:2017-04-27 11:32:06

标签: c++ opencv winapi bitmap

我需要在win32应用程序中进行一些图像处理,并且我正在使用opencv。我通过opencv读取图像文件并尝试将其转换为HBITMAP以使用StretchBlt显示它。我有一个功能:

void ConvertMatToBMP(Mat& mat, HBITMAP& hbitmap)
{
// define Bitmap Info structures
BITMAPINFO bmpInfo;
BITMAPINFOHEADER bmpInfoHeader;

// set members of BITMAPINFOHEADER
bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
bmpInfoHeader.biWidth = mat.cols;
bmpInfoHeader.biHeight = -mat.rows;
bmpInfoHeader.biPlanes = 1;

switch (mat.depth())
{
case CV_8U:
case CV_8S:
    bmpInfoHeader.biBitCount = mat.channels() * 8;
    break;
case CV_16U:
case CV_16S:
    bmpInfoHeader.biBitCount = mat.channels() * 16;
    break;
case CV_32S:
case CV_32F:
    bmpInfoHeader.biBitCount = mat.channels() * 32;
    break;
case CV_64F:
    bmpInfoHeader.biBitCount = mat.channels() * 64;
    break;
default:
    bmpInfoHeader.biBitCount = 0;
    break;
}

bmpInfoHeader.biCompression = BI_RGB;
bmpInfoHeader.biSizeImage = 0;
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biClrImportant = 0;

// set members of BITMAPINFO
bmpInfo.bmiHeader = bmpInfoHeader;
bmpInfo.bmiColors->rgbBlue = 0;
bmpInfo.bmiColors->rgbGreen = 0;
bmpInfo.bmiColors->rgbRed = 0;
bmpInfo.bmiColors->rgbReserved = 0;

HDC hdc = GetDC(imageview.ifHandle);
hbitmap = CreateDIBitmap(hdc, &bmpInfoHeader, CBM_INIT, mat.data, &bmpInfo, DIB_RGB_COLORS);
ReleaseDC(imageview.ifHandle, hdc);
} 

但它无法100%正常工作。对于某些图像,hbitmap为空,对于其他图像,图像是弯曲的,噪声或灰度。我首先忽略了这个问题,但现在我在处理有效图像时遇到了同样的问题。 例如,在将mat调整为小尺寸并将其转换为位图之后,hbitmap也会出现同样的问题。怪异的部分是当我抓取图像的第一行像素时,大部分时间问题都消失了。 我的问题是我的代码有什么问题?还是有更好的办法来做这些事情吗?

0 个答案:

没有答案