使用 BitBlt() 函数将窗口的图像信息复制到内存中的位图中。 怎么转换成 cv:: mat 并且可以与本机图片 就是匹配
时间: 2024-03-18 15:40:54 浏览: 226
基于QT的进程间通信,利用共享内存进行图片(Mat格式)传输。调用库opencv。
要将使用 BitBlt() 函数复制到内存中的位图转换成 OpenCV Mat,可以使用以下代码:
```c++
HDC hdcScreen = GetDC(NULL);
HDC hdcMemDC = CreateCompatibleDC(hdcScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, width, height);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMemDC, hBitmap);
BitBlt(hdcMemDC, 0, 0, width, height, hdcScreen, x, y, SRCCOPY);
BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = -height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
BYTE* pPixels = new BYTE[width * height * 3];
GetDIBits(hdcMemDC, hBitmap, 0, height, pPixels, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
SelectObject(hdcMemDC, hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(hdcMemDC);
ReleaseDC(NULL, hdcScreen);
cv::Mat img(height, width, CV_8UC3, pPixels);
cv::flip(img, img, 0);
delete[] pPixels;
```
在上面的代码中,我们首先使用 BitBlt() 函数将窗口的图像信息复制到内存中的位图中,然后使用 GetDIBits() 函数将位图转换成像素数据。接着,我们使用 OpenCV 的 Mat 类创建一个与位图大小相同的图像,再将像素数据复制到 Mat 对象中。最后,我们使用 flip() 函数翻转图片,使其与本机图片匹配。
注意,上面的代码中需要传入窗口的位置和大小,以及要复制的像素数据的格式。如果窗口位置和大小不正确,或者复制的像素数据格式不正确,可能会导致转换出来的 Mat 图像有误。
阅读全文