我正在尝试显示来自单色相机(Adimec N5A/CXP,符合GenIcam标准)的实时图像。
从供应商提供的示例中(但是是RGB 24),我大致能够显示图像,但颜色呈现非常奇怪(彩色和阴影代替灰度)。我猜测在位图头声明方面做错了什么:
我在BITMAPINFO结构体中的bmiColors字段中发现,'biClrUsed'应该设置为256。然后我不知道是否需要写一个块来描述'bmiColors'。我想每个像素只使用一个字节而不是r、g和b组件。
然后,在程序的更进一步部分(在函数"OnPaint"中),它使用函数"SetDIBitsToDevice"来显示之前创建的窗口中的图像。首先检索图像指针:
然后显示图片:
我不知道在最后一个参数中应该放什么,代替DIB_RGB_COLORS。我只找到了另一个值作为这个参数,即DIB_PAL_COLORS。我猜应该有一个灰度选项?这是我的程序的第一步......如果您有任何关于如何将图像指针推入opencv容器的建议,我也会非常高兴:-)。提前致谢!
从供应商提供的示例中(但是是RGB 24),我大致能够显示图像,但颜色呈现非常奇怪(彩色和阴影代替灰度)。我猜测在位图头声明方面做错了什么:
bitmapInfo = (LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD));
bitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo->bmiHeader.biPlanes = 1;
bitmapInfo->bmiHeader.biBitCount = 8; // 24
bitmapInfo->bmiHeader.biCompression = BI_RGB;
bitmapInfo->bmiHeader.biSizeImage = 0;
bitmapInfo->bmiHeader.biXPelsPerMeter = 0;
bitmapInfo->bmiHeader.biYPelsPerMeter = 0;
bitmapInfo->bmiHeader.biClrUsed = 256;
bitmapInfo->bmiHeader.biClrImportant = 0;
bitmapInfo->bmiHeader.biWidth = (LONG)width;
bitmapInfo->bmiHeader.biHeight = -(LONG)height;
/*
RGBQUAD* bmiColors = (RGBQUAD*)(bitmapInfo->bmiColors);
for (size_t index = 0; index < 256; ++index)
{
bmiColors[index].rgbBlue = (BYTE)index;
bmiColors[index].rgbGreen = (BYTE)index;
bmiColors[index].rgbRed = (BYTE)index;
bmiColors[index].rgbReserved = 0;
}
*/
我在BITMAPINFO结构体中的bmiColors字段中发现,'biClrUsed'应该设置为256。然后我不知道是否需要写一个块来描述'bmiColors'。我想每个像素只使用一个字节而不是r、g和b组件。
然后,在程序的更进一步部分(在函数"OnPaint"中),它使用函数"SetDIBitsToDevice"来显示之前创建的窗口中的图像。首先检索图像指针:
unsigned char *imagePtr = liveState.currentBuffer->getInfo<unsigned char *>(liveState.grabber, gc::BUFFER_INFO_BASE);
然后显示图片:
::SetDIBitsToDevice(dc, 0, 0, (DWORD)liveState.width, (DWORD)liveState.height, 0, 0, 0, (UINT)liveState.height, imagePtr, liveState.bitmapInfo, DIB_RGB_COLORS);
我不知道在最后一个参数中应该放什么,代替DIB_RGB_COLORS。我只找到了另一个值作为这个参数,即DIB_PAL_COLORS。我猜应该有一个灰度选项?这是我的程序的第一步......如果您有任何关于如何将图像指针推入opencv容器的建议,我也会非常高兴:-)。提前致谢!
cv::Mat
负载。我回来后会写一个答案。(可能有一些 WTL 位,但那非常接近 WinAPI) - Dan Mašekcv::Mat
构造函数(请注意,它不会复制数据,您需要确保指针在Mat
包装它的生命周期内保持有效)。 - Dan Mašek