我尝试捕获屏幕的一部分并将其放在cv::Mat
中,输出颜色相同(当我捕获白色背景时它是白色,灰色时它是灰色的,所以你可以理解它在某种程度上起作用)但图像是模糊的,对齐的和重复的(它重复相同的像素)。
例如,在我的Chrome浏览器中写下此问题后,我尝试了该程序,结果如下:
你可以识别浏览器(URL栏,文本框和按钮等等。但是图像本身远非准确甚至接近,并且像素在它们不应该是重复时是重复的(url)吧重复自己,文本框等)。
this问题中的代码未在我的机器上编译。但是我知道我使用的代码(不是OpenCV部分)可以在我的机器上运行(我已经用它来捕获我的屏幕,当我用libpng
保存它时,它工作得很好。)
我的代码如下(此处未声明的变量在其他地方声明,哪个值正确,我检查过,例如x
,w
,h
等):
HDC hdcSource = GetDC(NULL);
HDC hdcMemory = CreateCompatibleDC(hdcSource);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcSource, w, h);
HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hBitmap);
BITMAPINFOHEADER bmi = { 0 };
bmi.biSize = sizeof(BITMAPINFOHEADER);
bmi.biPlanes = 1;
bmi.biBitCount = 24;
bmi.biWidth = w;
bmi.biHeight = -h;
bmi.biCompression = BI_RGB;
bmi.biSizeImage = ((bmi.biWidth * bmi.biBitCount + 31) & ~31) / 8 * bmi.biHeight<0 ? -bmi.biHeight : bmi.biHeight;
bmi.biXPelsPerMeter = 0;
bmi.biYPelsPerMeter = 0;
bmi.biClrImportant = 0;
bmi.biClrUsed = 256;
if (!(BitBlt(hdcMemory, 0, 0, w, h, hdcSource, p1.x, p1.y, SRCCOPY)))
{
exit(1);
}
hBitmap = (HBITMAP)SelectObject(hdcMemory, hBitmapOld);
if (!hBitmap)
{
exit(1);
}
my_pic.create(h, w, CV_8UC4);
//StretchBlt(hdcSource, 0, 0, w, h, GetDC(NULL), 0, 0, w, h, SRCCOPY); //This line is what I saw in the other question but it didn't help
if (!(GetDIBits(hdcSource, hBitmap, 0, h, my_pic.data, (BITMAPINFO*)&bmi, DIB_RGB_COLORS)))
{
exit(1);
}
DeleteDC(hdcSource);
DeleteDC(hdcMemory);
答案 0 :(得分:1)
您有位图像素的RGB格式,但您尝试将其适合CV_8UC4(四通道)矩阵。尝试使用CV_8UC3矩阵类型。