【发布时间】:2018-09-22 17:38:10
【问题描述】:
我正在尝试显示来自单色相机(Adimec N5A/CXP,采用 GenIcam 标准)的实时图像。
来自供应商的示例(但在 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;
}
*/
我在bmiColors field of BITMAPINFO structure发现'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 容器有任何建议,我也会非常高兴:-)。
提前非常感谢!
【问题讨论】:
-
我使用调色板显示灰度图像(生成非常简单)。快速粘贴我的代码,因为我即将出发:pastebin.com/Yz0cQYT8——数据指针是原始的
cv::Mat有效负载。我回来后会写一个答案。 (那里可能有一些 WTL 位,但无论如何这与 WinAPI 非常接近) -
嗨,丹,我可以请你帮忙吗?如何使用 cv::Mat 从内存缓冲区加载图像?我想我应该使用 cv::imdecode,但我不能。我猜缓冲区类型有问题。 'Mat srcImg = imdecode(imagePointer, 0);'
-
内存缓冲区中有什么?原始图像数据(如上)?还是以 PNG、JPEG 或类似的格式编码图像数据?
-
如果它已经是原始图像数据,那么你使用this
cv::Matconstructor(注意它不会复制数据,你有责任确保指针保持有效,只要@987654329 @包装它的生活)
标签: c++ opencv image-processing bitmap visual-studio-2017