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/ –