0
我试图捕获屏幕的一部分,并把它放在一个cv::Mat
,输出是相同的颜色(当我捕获一个白色的背景是白色的,当它是灰色的灰色所以你可以理解它在某种程度上起作用),但图像是模糊的,对齐的和重复的(它重复相同的像素)。捕获屏幕的一部分在cv :: Mat
例如,当我在Chrome浏览器写这个问题我试过程序,结果是:
可以识别浏览器(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);
完美!非常感谢你,我不能相信我没有注意到它。不知何故,当我经常调用它时,它会像[这里](http://postimg.org/image/g3nrcla1d/)这样的某种原因对齐,但大多数时候(在我让电脑“休息”之后)几秒钟而不执行代码),它可以像[this](http://postimg.org/image/6nnedepad/)一样连续执行数次(例如5次)。任何想法为什么会这样?我认为唯一可能改变的可能是结局记忆,但是这会如何影响图片并使其保持一致?任何想法? – Jim
Opencv使用对齐方式,因此您需要对齐内存中的行。看看网络中有很多实现。垫到位图转换器。 –
看一看例如:http://answers.opencv.org/question/64896/how-to-fix-resized-image-in-mfc/ –