大佬教程收集整理的这篇文章主要介绍了C:灰度位图标题和实时绘制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; } */
我在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容器有任何建议,我也会非常高兴:-).
提前谢谢了 !
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开始:
接下来,设置调色板(这基本上是您注释掉的代码的位).
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,稍后我可以使用BitBlt
进行渲染.
HBITMAP bitmap = ::CreateDIBitmap(dc,&bmi->bmiHeader,CBM_INIT,data // Pointer to raw pixel data,bmi,DIB_RGB_COLORS);
以上是大佬教程为你收集整理的C:灰度位图标题和实时绘制opencv图像处理全部内容,希望文章能够帮你解决C:灰度位图标题和实时绘制opencv图像处理所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。