Запись рабочего стола в файл, используя openCV - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь использовать OpenCV, C ++ в моей системе Windows 10 для записи экрана как части более крупной программы, которую я пишу. Мне нужна возможность записи на дисплей и сохранения записи для последующего просмотра.

Мне удалось найти эту ссылку в stackoverflow

Как захватить рабочий стол в OpenCV (т.е. превратить растровое изображение в мат)?

Пользователь john ktejik создал функцию, которая, по сути, выполнила именно то, что я хочу достичь, за исключением сохранения потока в файл.

Теперь, что я всегда делал в прошлом, когда я открывал соединение с моей веб-камерой или видеофайлом, я мог просто создать объект VideoWriter и записать отдельные кадры в файл. Я попытался сделать это, используя функцию Джона, чтобы выступить в роли источника видео.

int main (int argc, char **argv)
{
    HWND hwndDesktop = GetDesktopWindow ();
    int key = 0;
    int frame_width = 1920;
    int frame_height = 1080;

    VideoWriter video ("screenCap.avi", CV_FOURCC ('M', 'J', 'P', 'G'), 15, Size (frame_width, frame_height));

    while (key != 27)
    {

        Mat src = hwnd2mat (hwndDesktop);

        video.write (src);
        imshow ("Screen Capture", src);
        key = waitKey (27);
    }
    video.release ();
    destroyAllWindows ();
    return 0;
}

В качестве вывода я вижу файл с именем "screenCap.avi", однако в нем нет видео. Файл сохраняется как 16 КБ памяти.

Функция Джона включена, так как она хорошо отображает кадры с помощью imshow (), но, похоже, не позволяет мне их сохранять.

1 Ответ

0 голосов
/ 06 мая 2019

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

Итак, я начал смотреть на каждую из строк в функции Джона.Я сталкивался с

src.create(height, width, CV_8UC4);

Кажется, что объект Mat создается как с 4 цветными каналами.Еще немного покопался, и я нашел пару ссылок, которые указывают на то, что Videowriter ожидает 3 канала.

Таким образом, простым изменением было преобразование вывода функции Джона из 4 каналов в 3 канала.Это решило проблему, и теперь я могу записать кадры в файл.

int main (int argc, char **argv)
{
    HWND hwndDesktop = GetDesktopWindow ();
    int key = 0;
    int frame_width = 1920;
    int frame_height = 1080;

    VideoWriter video ("screenCap.avi", CV_FOURCC ('M', 'J', 'P', 'G'), 15, Size 
(frame_width, frame_height));

    while (key != 27)
    {

        Mat src = hwnd2mat (hwndDesktop);
        Mat dst;

        cvtColor (src, dst, COLOR_BGRA2RGB);

        video.write (dst);
        imshow ("Screen Capture", dst);
        key = waitKey (27);
    }
    video.release ();
    destroyAllWindows ();
    return 0;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...