代码参考了:https://blog.csdn.net/sinat_36219858/article/details/70877677
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <windows.h>
using namespace cv;
LPVOID screenCaptureData = NULL;
HBITMAP hBitmap;
HDC hDDC;
HDC hCDC;
int nWidth;
int nHeight;
HWND hDesk;
void initGDI() {
nWidth = GetSystemMetrics(SM_CXSCREEN);//得到屏幕的分辨率的x
nHeight = GetSystemMetrics(SM_CYSCREEN);//得到屏幕分辨率的y
screenCaptureData = new char[nWidth*nHeight * 4];
memset(screenCaptureData, 0, nWidth);
hDesk = GetDesktopWindow();
hDDC = GetDC(hDesk);//得到屏幕的dc
hCDC = CreateCompatibleDC(hDDC);//
hBitmap = CreateCompatibleBitmap(hDDC, nWidth, nHeight);//得到位图
SelectObject(hCDC, hBitmap);
}
void gdiScreenCapture(LPVOID screenCaptureData) {
BitBlt(hCDC, 0, 0, nWidth, nHeight, hDDC, 0, 0, SRCCOPY);
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel / 8;
//mat操作
Mat v_mat(nHeight, nWidth, CV_MAKETYPE(CV_8U, nChannels));
GetBitmapBits(hBitmap, bmp.bmHeight*bmp.bmWidth*nChannels, v_mat.data);
imshow("test", v_mat);
}
int main()
{
initGDI();
while (100)
{
gdiScreenCapture(screenCaptureData);
waitKey();
}
DeleteObject(hBitmap);
ReleaseDC(hDesk, hDDC);
DeleteObject(hCDC);
delete[]screenCaptureData;
return 0;
}