我试图在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()很好地显示帧,但似乎不允许我保存它们。
答案 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;
}