获取窗口保存为图像
cv::Mat getImageFromWindow(HWND hwnd)
{
HDC hwindowDC, hwindowCompatibleDC;
int height, width, srcheight, srcwidth;
HBITMAP hbwindow;
Mat src;
BITMAPINFOHEADER bi;
hwindowDC = GetDC(hwnd);
hwindowCompatibleDC = CreateCompatibleDC(hwindowDC);
SetStretchBltMode(hwindowCompatibleDC, COLORONCOLOR);
RECT windowsize;
GetClientRect(hwnd, &windowsize);
srcheight = windowsize.bottom;
srcwidth = windowsize.right;
height = windowsize.bottom ; //change this to whatever size you want to resize to
width = windowsize.right ;
src.create(height, width, CV_8UC4);
hbwindow = CreateCompatibleBitmap(hwindowDC, width, height);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = -height; //this is the line that makes it draw upside down or not
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
SelectObject(hwindowCompatibleDC, hbwindow);
StretchBlt(hwindowCompatibleDC, 0, 0, width, height, hwindowDC, 0, 0, srcwidth, srcheight, SRCCOPY);
GetDIBits(hwindowCompatibleDC, hbwindow, 0, height, src.data, (BITMAPINFO *)&bi, DIB_RGB_COLORS);
DeleteObject(hbwindow); DeleteDC(hwindowCompatibleDC); ReleaseDC(hwnd, hwindowDC);
return src;
}
RGB24转换为YUV420
cv::Mat ConvertRGB24_YUV420(cv::Mat src)
{
cv::Mat yuv420;
cv::cvtColor(src, yuv420, CV_BGR2YUV_I420);
return yuv420;
}
YUV420转换为RGB24
cv::Mat YUV420_RGB24(unsigned char* src,int w,int h)
{
assert(src);
cv::Mat yuv420,rgb24;
yuv420.create(h * 3 / 2, w, CV_8UC1);
memcpy(yuv420.data, src, w*h * 3 / 2);
cv::cvtColor(yuv420, rgb24, CV_YUV2BGR_I420);
return rgb24;
}