2015-12-25 112 views
2

How to capture the desktop in OpenCV (ie. turn a bitmap into a Mat)?OPENCV桌面捕捉

你好,

任何人都可以向我解釋,我會怎麼使用這個代碼在OpenCV中捕捉到桌面屏幕?我一直試圖讓它工作大約30-45分鐘,但當我運行它時我的屏幕沒有捕獲任何東西。

在我的應用程序從主我有如下三個語句

HWND hwndDesktop = GetDesktopWindow(); 
hwnd2mat(hwndDesktop); 
imshow("output", src); 

我打電話是在上面的鏈接中找到的功能hwnd2mat。 我是一個noob。

感謝任何回答的人。

+0

的https: //www.youtube.com/watch?v=z7rS6bH_OHY這是我的目標 –

回答

2

看來你忘了捕捉hwnd2mat()的回報:在OP的評論

HWND hwndDesktop = GetDesktopWindow(); 
Mat src = hwnd2mat(hwndDesktop); 
imshow("output", src); 
waitKey(0); 
+0

真棒工作! –

+1

**投票**答案並點擊附近的**複選框**將其選爲官方答案。通過做這些事情,你正在幫助未來的遊客。 – karlphillip

3

我覺得還是有必要解釋如何捕獲的類似桌面的視頻流

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include <Windows.h> 
#include <iostream> 

using namespace std; 
using namespace cv; 

Mat hwnd2mat(HWND hwnd) 
{ 
    HDC hwindowDC,hwindowCompatibleDC; 

    int height,width,srcheight,srcwidth; 
    HBITMAP hbwindow; 
    Mat src; 
    BITMAPINFOHEADER bi; 

    hwindowDC=GetDC(hwnd); 
    hwindowCompatibleDC=CreateCompatibleDC(hwindowDC); 
    SetStretchBltMode(hwindowCompatibleDC,COLORONCOLOR); 

    RECT windowsize; // get the height and width of the screen 
    GetClientRect(hwnd, &windowsize); 

    srcheight = windowsize.bottom; 
    srcwidth = windowsize.right; 
    height = windowsize.bottom/1; //change this to whatever size you want to resize to 
    width = windowsize.right/1; 

    src.create(height,width,CV_8UC4); 

    // create a bitmap 
    hbwindow = CreateCompatibleBitmap(hwindowDC, width, height); 
    bi.biSize = sizeof(BITMAPINFOHEADER); //http://msdn.microsoft.com/en-us/library/windows/window/dd183402%28v=vs.85%29.aspx 
    bi.biWidth = width; 
    bi.biHeight = -height; //this is the line that makes it draw upside down or not 
    bi.biPlanes = 1; 
    bi.biBitCount = 32; 
    bi.biCompression = BI_RGB; 
    bi.biSizeImage = 0; 
    bi.biXPelsPerMeter = 0; 
    bi.biYPelsPerMeter = 0; 
    bi.biClrUsed = 0; 
    bi.biClrImportant = 0; 

    // use the previously created device context with the bitmap 
    SelectObject(hwindowCompatibleDC, hbwindow); 
    // copy from the window device context to the bitmap device context 
    StretchBlt(hwindowCompatibleDC, 0,0, width, height, hwindowDC, 0, 0,srcwidth,srcheight, SRCCOPY); //change SRCCOPY to NOTSRCCOPY for wacky colors ! 
    GetDIBits(hwindowCompatibleDC,hbwindow,0,height,src.data,(BITMAPINFO *)&bi,DIB_RGB_COLORS); //copy from hwindowCompatibleDC to hbwindow 

    // avoid memory leak 
    DeleteObject (hbwindow); 
    DeleteDC(hwindowCompatibleDC); 
    ReleaseDC(hwnd, hwindowDC); 

    return src; 
} 

int main(int argc, char **argv) 
{ 
    HWND hwndDesktop = GetDesktopWindow(); 
    namedWindow("output",WINDOW_NORMAL); 
    int key = 0; 

    while(key != 27) 
    { 
     Mat src = hwnd2mat(hwndDesktop); 
     // you can do some image processing here 
     imshow("output", src); 
     key = waitKey(60); // you can change wait time 
    } 

} 
+0

謝謝。它運作良好 – traeper