我需要在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也会出现同样的问题。怪异的部分是当我抓取图像的第一行像素时,大部分时间问题都消失了。 我的问题是我的代码有什么问题?还是有更好的办法来做这些事情吗?