C:灰度位图标题和实时绘制opencv图像处理

C:灰度位图标题和实时绘制opencv图像处理,第1张

概述我试图显示来自单色相机的实时图像(Adimec N5A / CXP,GenIcam标准). 从供应商提供的示例(但在RGB 24中),我或多或少能够显示图像,但颜色渲染非常奇怪(颜色和阴影而不是灰度).我想我在位图头声明中做错了: bitmapInfo = (LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)); b 我试图显示来自单色相机的实时图像(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,(DWORD)liveState.wIDth,(DWORD)liveState.height,(UINT)liveState.height,imagePtr,liveState.bitmAPInfo,DIB_RGB_colorS);

我不知道放什么而不是DIB_RGB_colorS作为最后一个参数.我只找到了此参数的另一个值DIB_PAL_colorS.我想应该有一个灰度选项?

这是我的程序的第一步……如果您对如何将图像指针推入opencv容器有任何建议,我也会非常高兴:-).

提前谢谢了 !

解决方法 看起来你很亲密.显示灰度图像的方法是使用调色板.这只是256个RGB条目,代表黑色和白色之间的所有阴影:

std::vector<RGBQUAD> pal(256);for (int32_t i(0); i < 256; ++i) {    pal[i].rgbRed = pal[i].rgbGreen = pal[i].rgbBlue = i;    pal[i].rgbReserved = 0;}

首先,您需要分配足够的内存来保存BITMAPINFOheader以及定义要使用的调色板的256个RGBQUAD条目.

int32_t const bmi_size(sizeof(BITMAPINFOheader) + sizeof(RGBQUAD) * 256);

分配结构.我使用_alloca把它放在堆栈上,所以我不需要担心清理.

BITMAPINFO* bmi(static_cast<BITMAPINFO*>(alloca(bmi_size)));

您需要设置以下BITMAPINFOheader成员,其余成员可以保留为零.

bmi->bmiheader.biSize = sizeof(BITMAPINFOheader);bmi->bmiheader.biWIDth = static_cast<LONG>(wIDth);bmi->bmiheader.biHeight = static_cast<LONG>(-height);bmi->bmiheader.biPlanes = 1;bmi->bmiheader.biBitCount = 8;bmi->bmiheader.biCompression = BI_RGB;

注意:由于我们有一个完整的256条目调色板,biClrUsed可以设置为0.从docs开始:

If this value is zero,the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member…

接下来,设置调色板(这基本上是您注释掉的代码的位).

for (uint32_t i(0); i < 256; ++i) {    if (pal.size() > i) {        bmi->bmicolors[i] = pal[i];    } else {        bmi->bmicolors[i].rgbRed            = bmi->bmicolors[i].rgbGreen            = bmi->bmicolors[i].rgbBlue            = bmi->bmicolors[i].rgbReserved = 0;    }}

注意:上面的代码来自通用的调色板图像渲染功能.对于较小的调色板,它用黑色填充未使用的颜色.我想这可以重构为使用较少的条目以及biClrUsed设置为适当的值.

现在位图标头已准备就绪.在您的情况下,对SetDIBitsToDevice的调用仍将使用DIB_RGB_colorS,因为“颜色表包含文字RGB值”.

我使用CreateDIBitmap创建一个DDB,稍后我可以使用@L_301_5@进行渲染.

HBITMAP bitmap = ::CreateDIBitmap(dc,&bmi->bmiheader,CBM_INIT,data // Pointer to raw pixel data,bmi,DIB_RGB_colorS);
总结

以上是内存溢出为你收集整理的C:灰度位图标题和实时绘制opencv图像处理全部内容,希望文章能够帮你解决C:灰度位图标题和实时绘制opencv图像处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229068.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存