Ошибка matchTemplate из OpenCV

подскажите пожалуйста. Есть работающая функция переводящая скриншот экрана в объект типа Mat из OpenCV.

Mat Screen()  
{
    HDC rabstol = GetDC(NULL); 
    HDC novaDC = CreateCompatibleDC(rabstol); 

    HBITMAP BitmapStola = CreateCompatibleBitmap(rabstol, 1920, 1080);

    SelectObject(novaDC, BitmapStola); 
    BitBlt(novaDC, 0, 0, 1920, 1080, rabstol, 0, 0, SRCCOPY);

    BITMAPINFOHEADER bi;
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = 920;
    bi.biHeight = -500;
    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;

    Mat mat = Mat(500, 920, CV_8UC4); 
    GetDIBits(novaDC, BitmapStola, 0, 500, mat.data, (BITMAPINFO*)&bi, DIB_RGB_COLORS);

    DeleteObject(BitmapStola);
    DeleteDC(novaDC);
    ReleaseDC(NULL, rabstol);
    
    return mat;
}

передача результата этой функции в первый параметр matchTemplate() вызывает ошибку:

Mat templ, result;
Mat img = Screen();
matchTemplate(img, templ, result, TM_SQDIFF_NORMED);

Но если img сначала записать на диск а потом прочитать, все работает:

Mat templ, result;
Mat img = Screen();
imwrite("D:\\1.jpg", mat);
img = imread("D:\\1.jpg");
matchTemplate(img, templ, result, TM_SQDIFF_NORMED);

я предполагаю дело в типе вектора Mat. Создавая функцией Screen() я делаю неподходящим для matchTemplate(). а когда читаю с диска то функция imread() конвертирует как нужно.

вопрос, можно ли конвертировать результат Screen() без записи на диск? спасибо


Ответы (1 шт):

Автор решения: Dima Cima

спасибо всем кто участвовал, и подталкивал к решению. ответ нашелся:

функцией cvtColor(img, img, COLOR_BGRA2BGR); нужно удалить 4й канал, который возвращался из функции скриншота.

в документации OpenCV по требованиям первого параметра функции matchTemplate() написано только 8 или 32 бит. про каналы ничего (

→ Ссылка