我可以将从相机获取的单通道图像输出到 winAppi 窗口中吗?
Can I output a one channel image acquired from camera into a winAppi window?
我有一个指向使用第三方SDK从相机获取的图像的指针。图像为一个波段(单声道 8(。我想将其作为位图输出到 winAppi 窗口中。我所做的是
HBITMAP hBitmap = NULL;
BITMAPINFOHEADER bmih;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = 1280;
bmih.biHeight = 960;
bmih.biPlanes = 1;
bmih.biBitCount = 8;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;
BITMAPINFO dbmi;
ZeroMemory(&dbmi, sizeof(dbmi));
dbmi.bmiHeader = bmih;
dbmi.bmiColors->rgbBlue = 0;
dbmi.bmiColors->rgbGreen = 0;
dbmi.bmiColors->rgbRed = 0;
dbmi.bmiColors->rgbReserved = 0;
void* bits = &aquiredImageCPU.m_sMemory.ptr()[0];
hBitmap = CreateDIBitmap(dc, &bmih, CBM_INIT, bits, &dbmi, DIB_RGB_COLORS);
src = CreateCompatibleDC(dc);
SelectObject(src, hBitmap);
BitBlt(dc, 10,10,512, 512, src, 0, 0, SRCCOPY);
如果我将图像输出为矩阵并使用我的库(我使用 imsave 类似于 matlabs imsave 的库(对其进行预览,我可以看到图像正常(灰度图像(。但是当我将其输出到 winAppi 窗口时,它会将其转换为 RGB。我认为这与
HDC dc = GetDC(hwnd);
src = CreateCompatibleDC(dc);
有什么建议吗?谢谢
我在类似情况下所做的是每 8 位取一次,并在 8 位块之后再复制 2 次。这有效,但成本很高,我需要有一个真正的瓷砖应用程序。
auto outputImageHight = 1280;
auto outputImageWidth = 960;
unsigned char *myArray = new unsigned char[3 * outputImageHight * outputImageWidth];
for (int i = 0; i < outputImageHight; i++)
for (int j = 0; j < outputImageWidth; j++)
{
unsigned char ucTmp = (unsigned char)(image(i, j));
myArray[3 * (i + outputImageHight * j) + 0] = ucTmp;
myArray[3 * (i + outputImageHight * j) + 1] = ucTmp;
myArray[3 * (i + outputImageHight * j) + 2] = ucTmp;
}
8 位位图需要颜色表。 由于您想要灰度,因此必须将颜色表设置为具有 256 个灰度级别。 您已将第一个设置为黑色,这是正确的,但您尚未设置其余部分。
BITMAPINFO实际上是一个可变大小的结构。 bmiColors 字段只是颜色表中第一种颜色的占位符。 您必须为整个颜色表分配额外的空间并填写它。
std::size_t size = sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
std::vector<char> buffer(size);
BITMAPINFO *dbmi = reinterpret_cast<BITMAPINFO *>(buffer.data());
ZeroMemory(dbmi, size); // probably unnecessary
dbmi->bmiHeader = bmih;
for (int i = 0; i < 256; ++i) {
dbmi->bmiColors[i].rgbBlue = i;
dbmi->bmiColors[i].rgbGreen = i;
dbmi->bmiColors[i].rgbRed = i;
dbmi->bmiColors[i].rgbReserved = 0;
}
相关文章:
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 如何从amd gpus的显示输出中获取图像数据
- 使用opencv在GPU上调整图像大小会产生空的输出矩阵
- 使用几何着色器的图层渲染似乎只输出图像数组的第一层
- TensorFlow图像识别输出格式C
- 将输出图像保存在Caffe中
- 我可以将从相机获取的单通道图像输出到 winAppi 窗口中吗?
- 输入层类型:图像数据在窗口咖啡cpp中给出空白输出
- 将 RGB 图像转换为 3 个 HSI 输出
- MFC-无法从资源输出BMP图像
- OpenCV,Dlib - 作为黑色图像输出的垫子对象
- 如何显示窗口大小不同的输出图像?通过使用 cv::Mat
- 将中值剪切颜色缩减算法的输出调色板应用于源图像
- 如何使用 ASCII 代码在输出屏幕上显示图像C++
- C++-试图读取.PPM图像,意外输出
- 输出窗口显示三个图像,而不是一个
- 如何将视频文件作为输入传递给NodeJS中的子进程,并接收帧/图像作为输出
- 卷积模糊图像产生一个粗略的输出图像
- Linux CGI Web API -如何在c++下输出二进制JPEG图像
- 使用 openCV c++ 示例代码执行抓取后保存输出图像