OpenCV Error Assertion failed <s >=0> in cv::setSize, file C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\src\matric.cpp, line 306

asked 2016-04-19 23:24:35 -0500

dott gravatar image

updated 2016-04-19 23:27:07 -0500

when i try to compile this code, it gives me then, Unhandled exception at 0x000000xxxx in video input.exe: Microsoft C++ exception: cv::Exception at memory location 0x0000000000xxxxxx then thrown me to mat.inl.hpp line 306 maybe it has to do with this function :

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.1;  //change this to whatever size you want to resize to
    width = windowsize.right /1.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;
}
edit retag flag offensive close merge delete

Comments

try to print out width and height before src.create(height, width, CV_8UC4);

(most likely, your window handle is invalid)

berak gravatar imageberak ( 2016-04-20 02:21:10 -0500 )edit

i use this : printf("width : %d\n, height : %d\n", width, height); system("PAUSE"); it gives me with width : -858993460 height : -858993460 , can you tell me what is happen ?

dott gravatar imagedott ( 2016-04-20 03:37:16 -0500 )edit

so, this is clearly not valid, unfortunately, finding out why is beyond the scope of this site (this is all about win32 programming, not about opencv at all).

berak gravatar imageberak ( 2016-04-20 03:47:33 -0500 )edit

because it is minus ? the return is int ?

dott gravatar imagedott ( 2016-04-20 04:01:08 -0500 )edit

printf("%-6x\n", -858993460); -> cccccc

it is just uninitialized memory (set to 0xcc , because you're in debug mode)

berak gravatar imageberak ( 2016-04-20 04:05:57 -0500 )edit

yes it goes to cccccccc , how to set to 0xcc ?

dott gravatar imagedott ( 2016-04-20 04:14:34 -0500 )edit

no, you don't have to. each byte in memory is set to cc initially. the RECT was never set to anything.

debug your function, line by line, most probably your hwnd was invalid from the beginning.

berak gravatar imageberak ( 2016-04-20 04:18:17 -0500 )edit

if this RECT reference is right : https://msdn.microsoft.com/en-us/libr... , then there's a problem in RECT function, (actually i didn't write that function, but it works using OPENCV for my goal) , and actually my goal is Capture Desktop or specific window as source in OPENCV and that function is create a bitmap from the screen image and loop it , am i doing right so far in your opinion ?

dott gravatar imagedott ( 2016-04-20 04:59:08 -0500 )edit

again, program works fine for me

berak gravatar imageberak ( 2016-04-20 05:07:43 -0500 )edit

i still can't solve the bug, could you teach me. well the problem is, the code is works fine when capture screen, but when to capture something rendered like youtube or streaming, here it goes the code stuck at something at sizeof() , now, i can't identify which one or where

dott gravatar imagedott ( 2016-04-22 09:55:46 -0500 )edit