使用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将桌面录制到文件的主要内容,如果未能解决你的问题,请参考以下文章