2015-12-22 32 views
0

我试图捕获屏幕的一部分,并把它放在一个cv::Mat,输出是相同的颜色(当我捕获一个白色的背景是白色的,当它是灰色的灰色所以你可以理解它在某种程度上起作用),但图像是模糊的,对齐的和重复的(它重复相同的像素)。捕获屏幕的一部分在cv :: Mat

例如,当我在Chrome浏览器写这个问题我试过程序,结果是: fuzzy output

可以识别浏览器(URL栏,文本框和按钮等。但是图像本身并不准确甚至不准确,像素在不应该重复的情况下(网址栏重复自身,文本框等)。

this问题中的代码未在我的但我知道我使用的代码(不是OpenCV的一部分)在我的机器上工作(我已经用它来捕获我的屏幕,并且它在我保存时运行得非常好与libpng)。

我的代码如下(这里未声明的其他地方声明和值是正确的,我查了变量,如xwh等):

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); 

回答

1

你有用于位图像素的RGB格式,但您试图将其适用于CV_8UC4(四通道)矩阵。尝试使用CV_8UC3矩阵类型。

+0

完美!非常感谢你,我不能相信我没有注意到它。不知何故,当我经常调用它时,它会像[这里](http://postimg.org/image/g3nrcla1d/)这样的某种原因对齐,但大多数时候(在我让电脑“休息”之后)几秒钟而不执行代码),它可以像[this](http://postimg.org/image/6nnedepad/)一样连续执行数次(例如5次)。任何想法为什么会这样?我认为唯一可能改变的可能是结局记忆,但是这会如何影响图片并使其保持一致?任何想法? – Jim

+0

Opencv使用对齐方式,因此您需要对齐内存中的行。看看网络中有很多实现。垫到位图转换器。 –

+0

看一看例如:http://answers.opencv.org/question/64896/how-to-fix-resized-image-in-mfc/ –