2015-12-22 80 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/ –