亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在OpenCV中捕獲桌面(即,將位圖轉換為Mat)?

如何在OpenCV中捕獲桌面(即,將位圖轉換為Mat)?

慕妹3242003 2019-11-12 10:33:18
我想使用OpenCV處理桌面,就好像它是視頻流一樣。我熟悉OpenCV。我不熟悉Windows API。我意識到還有其他捕獲屏幕的方法,但是出于我的問題,我需要使用OpenCV來完成。這是我的(超級天真)代碼:HWND hDesktopWnd;HDC hDesktopDC;hDesktopWnd=GetDesktopWindow();hDesktopDC=GetDC(hDesktopWnd);// get the height and width of the screenint height = GetSystemMetrics(SM_CYVIRTUALSCREEN);int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);// create a bitmapHBITMAP hbDesktop = CreateCompatibleBitmap( hDesktopDC, width, height);Mat src(height,width,CV_8UC4);src.data = (uchar*)hbDesktop;imshow("output",src);  //fails :(在StackOverflow上也有類似的問題,但這些問題要么針對舊式OpenCV,要么針對Android操作系統。我在Windows 7 64xOpencv 2.4.3上感謝任何可以回答這個問題的人。
查看完整描述

3 回答

?
Helenr

TA貢獻1780條經驗 獲得超4個贊

一種更好的方法是在將內存分配給像素一次的同時執行此操作。所以這里唯一要做的就是BitBlt制作的副本

int main()


{


    int x_size = 800, y_size = 600; // <-- Your res for the image






    HBITMAP hBitmap; // <-- The image represented by hBitmap


    Mat matBitmap; // <-- The image represented by mat






    // Initialize DCs


    HDC hdcSys = GetDC(NULL); // Get DC of the target capture..

    HDC hdcMem = CreateCompatibleDC(hdcSys); // Create compatible DC 







    void *ptrBitmapPixels; // <-- Pointer variable that will contain the potinter for the pixels










    // Create hBitmap with Pointer to the pixels of the Bitmap

    BITMAPINFO bi; HDC hdc;

    ZeroMemory(&bi, sizeof(BITMAPINFO));

    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

    bi.bmiHeader.biWidth = x_size;

    bi.bmiHeader.biHeight = -y_size;  //negative so (0,0) is at top left


    bi.bmiHeader.biPlanes = 1;


    bi.bmiHeader.biBitCount = 32;

    hdc = GetDC(NULL);

    hBitmap = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &ptrBitmapPixels, NULL, 0);

    // ^^ The output: hBitmap & ptrBitmapPixels



    // Set hBitmap in the hdcMem 

    SelectObject(hdcMem, hBitmap);




    // Set matBitmap to point to the pixels of the hBitmap

    matBitmap = Mat(y_size, x_size, CV_8UC4, ptrBitmapPixels, 0);

    //                ^^ note: first it is y, then it is x. very confusing


    // * SETUP DONE *





    // Now update the pixels using BitBlt

    BitBlt(hdcMem, 0, 0, x_size, y_size, hdcSys, 0, 0, SRCCOPY);



    // Just to do some image processing on the pixels.. (Dont have to to this)

    Mat matRef = matBitmap(Range(100, 200), Range(100, 200));

    //                              y1    y2            x1     x2

    bitwise_not(matRef, matRef); // Invert the colors in this x1,x2,y1,y2





    // Display the results through Mat

    imshow("Title", matBitmap);


    // Wait until some key is pressed


    waitKey(0);



    return 0;



}

請注意,這里沒有進行錯誤處理以使其易于理解,但是您必須在代碼中進行錯誤處理!


希望這可以幫助


查看完整回答
反對 回復 2019-11-12
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

值得注意的是,如果上面的代碼在可重復使用的場景(例如循環)中使用,從長遠來看,將導致內存泄漏并泛濫您的堆內存/崩潰應用程序。您必須調用DeleteObject(hBitmap); 和matBitmap.release()處理完圖像后。

查看完整回答
反對 回復 2019-11-12
  • 3 回答
  • 0 關注
  • 2524 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號