第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

慕妹3242003 2019-11-12 10:33:18
我想使用OpenCV處理桌面,就好像它是視頻流一樣。我熟悉OpenCV。我不熟悉Windows API。我意識(shí)到還有其他捕獲屏幕的方法,但是出于我的問題,我需要使用OpenCV來完成。這是我的(超級(jí)天真)代碼: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上也有類似的問題,但這些問題要么針對(duì)舊式OpenCV,要么針對(duì)Android操作系統(tǒng)。我在Windows 7 64xOpencv 2.4.3上感謝任何可以回答這個(gè)問題的人。
查看完整描述

3 回答

?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

一種更好的方法是在將內(nèi)存分配給像素一次的同時(shí)執(zhí)行此操作。所以這里唯一要做的就是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;



}

請(qǐng)注意,這里沒有進(jìn)行錯(cuò)誤處理以使其易于理解,但是您必須在代碼中進(jìn)行錯(cuò)誤處理!


希望這可以幫助


查看完整回答
反對(duì) 回復(fù) 2019-11-12
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

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

查看完整回答
反對(duì) 回復(fù) 2019-11-12
  • 3 回答
  • 0 關(guān)注
  • 2520 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)