使用openCV将桌面记录到文件

时间:2019-05-03 19:13:28

标签: c++ opencv windows-10

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

我能够在stackoverflow上找到此链接

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 个答案:

答案 0 :(得分:0)

因此,在周末,我更多地使用了该软件。而且,由于我确实对此没有足够的把握,因此我认为屏幕捕获和文件编写器之间的设置必然存在问题。

因此,我开始查看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;

}