使用openCV将桌面录制到文件

Posted

技术标签:

【中文标题】使用openCV将桌面录制到文件【英文标题】:Recording desktop to file, using openCV 【发布时间】:2019-05-03 19:13:27 【问题描述】:

我正在尝试在我的 Windows 10 系统上使用 OpenCV、C++ 来记录屏幕,作为我正在编写的更大程序的一部分。我需要能够记录显示并保存记录以供以后查看。

我在***上找到了这个链接

How to capture the desktop in OpenCV (ie. turn a bitmap into a Mat)?

用户 john ktejik 创建了一个函数,该函数实质上完全完成了我想要完成的任务,没有将流保存到文件中。

现在,我过去一直在做的事情是,一旦我打开了与网络摄像头或视频文件的连接,我就可以简单地创建一个 VideoWriter 对象并将各个帧写入文件。我试图利用 John 的功能作为视频源来做到这一点。

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”的文件,但该文件没有视频。该文件保存为 16KB 存储空间。

John 的函数很重要,因为它通过 imshow() 很好地显示帧,但似乎不允许我保存它们。

【问题讨论】:

【参考方案1】:

所以周末我又玩了一些软件。而且由于我真的没有牢牢掌握它,我认为屏幕捕获和文件编写器之间的设置一定有问题。

所以我开始查看 John 函数中的每一行。我遇到了

src.create(height, width, CV_8UC4);

似乎 Mat 对象正在创建为具有 4 个颜色通道。做了更多的挖掘,我发现了一些指向 Videowriter 期望 3 个频道的参考资料。

所以一个简单的改变就是将 Johns 函数的输出从 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;

【讨论】:

以上是关于使用openCV将桌面录制到文件的主要内容,如果未能解决你的问题,请参考以下文章

以指定的时间间隔录制视频,然后将它们保存到文件 OpenCv Python

使用 opencv 和 Qt 录制视频

Rust Tauri & OpenCV 写一个桌面摄像头

Rust Tauri & OpenCV 写一个桌面摄像头

Rust Tauri & OpenCV 写一个桌面摄像头

OpenCV:录制扭曲的视频