C ++ / OpenCV使用VideoWriter更改文件名&停止记录

时间:2014-09-17 12:56:23

标签: opencv save avi video-recording

我使用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;更改用于在循环中写入的文件名。

谢谢:)

1 个答案:

答案 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);
}