2016-04-19 3 views
0

Продолжение в предыдущем посте от OPENCV Destop Capture и этой функции hwnd2mat, способ захвата рабочего стола в качестве источника в opencv - создать растровое изображение с изображения на экране с помощью этой функции hwnd2mat. сделанный. эта функция уже создает растровое изображение с экрана image.but.Это дает странный эффект, как завершение внутри видео, я просто хочу, чтобы нормальный источник видео, скорее всего, как this one. я уже пытаюсь найти причину этого, но я не знаю больше.Захват рабочего стола OPENCV. Часть II

#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", CV_WINDOW_NORMAL); 
    int key = 0; 

    while (key != 30) 
    { 
     Mat src = hwnd2mat(hwndDesktop);   
     // you can do some image processing here 
     imshow("output", src); 
     key = waitKey(30); // you can change wait time 
    } 
    ReleaseCapture(); 
    destroyAllWindows(); 
    return 0; 
} 
+0

странный эффект выглядит следующим образом: https://www.youtube.com/watch?v=RQePoFEUS3A&feature=youtu.be, можете ли вы, ребята, сказать мне, что произойдет –

+1

, чтобы вы не захотели захватить весь экран, но только одно окно? Очевидно, что если вы захватили весь экран, вы снова захватите выходное изображение, что приведет к этому эффекту с бесконечным зеркалом. Вместо «GetDesktopWindow» вы должны открыть/найти дескриптор окна, которое вы хотите захватить. – Micka

+0

@ Микка, я понимаю, я должен найти дескриптор окна, которое хочу захватить, но что это вместо 'GetDesktopWindow'? –

ответ

0

Использование GetDesktopWindow() будет делать бесконечное зеркало эффект, вместо этого, используя то, что окно, которое вы хотите захватить, и я, я использую FindWindowEx(), и использовать Spy ++, чтобы найти то, что окно, которое вы хотите захват, который должен работать. но, конечно, это перейдет к следующей ошибке :).

Смежные вопросы