我使用MOG2来检测轮廓,并希望在某些内容移动后保存视频文件(例如轮廓> x)。这里的问题是我想停止写作"一旦移动的身体消失(例如轮廓== 0),并在前一次录制停止后移动一个东西后写入新文件。
仅使用1个视频文件保存本身并不是问题,我还设法创建了具有不同文件名的多个文件。 问题是:
1)视频没有停止:有没有办法在不离开循环的情况下停止写作?
2)如果我使用"我的方式"创建新的avi文件,它们不超过455kB,无法观看/打开。 如何更改循环中的文件名以便实际创建工作文件?
这是我的代码的重要部分:
仅包含1个文件的版本:
BackgroundSubtractorMOG2 bg(10,100,true);
vector < vector < Point > >contours;
Mat fgmask, fgimg, backgroundImage;
VideoWriter video("out.avi", CV_FOURCC('I','Y','U','V') ,10, Size(camera1_undist.cols, camera1_undist.rows),true);
和写视频的循环:
while(1)
{
bg.operator()(camera1_undist, fgimg);
bg.getBackgroundImage(backgroundImage);
findContours(fgimg, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
drawContours(camera1_undist, contours, -1, Scalar(0,0,255), 2);
video << camera1_undist;
no_new_movement = false;
imshow("Motion", camera1_undist);
imshow("Background", backgroundImage);
}
我不知道如何停止一个视频并开始使用新文件名实际工作的新视频。 为了创建多个文件,我尝试添加它(并将VideoWriter从顶部移开):
if(contours.size() >= 15 && contours.size() < 100)
{
sprintf(filename, "out_%06d.avi", index);
VideoWriter video(filename, CV_FOURCC('I','Y','U','V') ,10, Size(camera1_undist.cols, camera1_undist.rows),true);
video << camera1_undist;
no_new_movement = false;
}
if(!no_new_movement)
{
index++;
no_new_movement = true;
}
我真的希望有人可以就上述问题给我一些意见 - 停止VideoWriter :: write&amp;更改用于在循环中写入的文件名。
谢谢:)
答案 0 :(得分:2)
1)视频没有停止:有没有办法在不离开循环的情况下停止写作?
是。:通过video << camera1_undist;
将视频添加到视频中,对吧?!因此,在循环中,只要您觉得不再需要添加框架,只需将控制变量的值更改为false
:
if (should_add_frames) {
video << camera1_undist;
}
2)如果我使用&#34;我的方式&#34;创建新的avi文件,它们不超过455kB,无法观看/打开。如何更改循环中的文件名以便实际创建工作文件?
在循环内部,每当需要更改文件名时,使用另一个控制变量来执行以下代码:
if (should_change_filename) {
video.release();
video.open(new_filename,
CV_FOURCC('I','Y','U','V'),
10,
Size(camera1_undist.cols, camera1_undist.rows),
true);
}