简体   繁体   English

使用opencv c ++每1分钟创建一个新的视频文件

[英]create new video file every 1 minutes with opencv c++

I'm working on a little "Dashcam" with opencv. 我正在使用opencv开发一个小“Dashcam”。 The principe is simple every minute I want to create a new video file named with the current date and time. 我想创建一个以当前日期和时间命名的新视频文件,每分钟原理很简单。 The content of those video files is the frame of the webcam. 这些视频文件的内容是网络摄像头的框架。

However, after the first minute has passed, no more video file is generated. 但是,在第一分钟过后,不再生成视频文件。

Here is my commented code: 这是我评论的代码:

#include <iostream>
#include <windows.h>
#include <ctime>
#include <time.h>
#include <fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;


int record_video()
{
    VideoCapture cam(0);
    if (!cam.isOpened())
    {
        cout << "Error from webcam" << endl;
        return -1;
    }

    time_t t = time(0);
    struct tm* now = localtime( & t );
    char buffer[80];

    strftime(buffer, 80, "%F_%Hh%M.wmv", now); //get the date and time for my file

    VideoWriter video(buffer, CV_FOURCC('W', 'M', 'V', '2'), 30, Size(640, 480), true); //Creation of my video file from my webcam

    int chrono = 0; //start the chrono at 
    bool record = false;

    while (1)
    {
        Mat frame;
        cam >> frame;
        if (frame.empty())
        {
            cout << "frame is empty" << endl;
            return -1;
        }
        cout << chrono << endl;
        if ((chrono == 1) && (record == false)) //we start from the begining at 0 seconds and the recording has to be false to record again with the last condition (3rd condition)
        {
            cout << "new recording in file: " << buffer << endl; //display the name of video file on the console
            record = true;
        }
        if (record == true) //The condition here is to activate 
        {
            video.write(frame); //copy the frame from the webcam to the video file
            imshow("webcam", frame); //display what we record on a window
        }
        if (chrono == 1800) //the 1800 chrono = 60 seconds
        {
            record = false; //record is equal at false to repeat the first condition
            chrono = 1; //record is equal at false to repeat the first condition
        }

        chrono++; //incrementation of the chrono

        char c = (char)waitKey(1);
        if (c == 27)
            video.write(frame);     
    }
    cam.release();
    destroyAllWindows();
    return 0;
}

int main()
{
    record_video();
    return 0;
}
    if (chrono == 1800) //the 1800 chrono = 60 seconds
    {
        record = false; //record is equal at false to repeat the first condition
        chrono = 1; //record is equal at false to repeat the first condition
    }

    chrono++; //incrementation of the chrono

After this chrono will be 2 and record will be false , so your code will never record again (because (chrono == 1) && (record == false) will never be true ). 在此chrono将为2并且record将为false ,因此您的代码将永远不会再次记录(因为(chrono == 1) && (record == false)将永远不会true )。 You need to set chrono to 0 in that if-body, so it gets incremented to 1 afterwards, or move the incrementation into the body of if (record == true) , so it doesn't get incremented when you're not recording. 你需要在if-body中将chrono设置为0 ,然后将其增加到1 ,或者将增量移动到if (record == true)的主体中,这样当你不记录时它不会增加。

Either: 或者:

    if (record == true) //The condition here is to activate 
    {
        video.write(frame); //copy the frame from the webcam to the video file
        imshow("webcam", frame); //display what we record on a window
        chrono++; //incrementation of the chrono
    }

(and remove the chrono++ further down) (并进一步删除chrono++

Or: 要么:

    if (chrono == 1800) //the 1800 chrono = 60 seconds
    {
        record = false; //record is equal at false to repeat the first condition
        chrono = 0; //record is equal at false to repeat the first condition
    }

    chrono++; //incrementation of the chrono

On a site node, you are currently not creating a new video every minute, but adding to the same video. 在站点节点上,您当前不是每分钟都创建一个新视频,而是添加到同一视频。 You probably want to move the lines creating your VideoWriter into your loop, specifically inside if ((chrono == 1) && (record == false)) . 您可能希望将创建VideoWriter的行移动到循环中,特别是if ((chrono == 1) && (record == false)) Outside the loop, simply keep VideoWriter video; 在循环之外,只需保留VideoWriter video; and use open to initialize a new video file: 并使用open初始化一个新的视频文件:

    if ((chrono == 1) && (record == false)) //we start from the begining at 0 seconds and the recording has to be false to record again with the last condition (3rd condition)
    {
        time_t t = time(0);
        struct tm* now = localtime( & t );
        char buffer[80];

        strftime(buffer, 80, "%F_%Hh%M.wmv", now); //get the date and time for my file

        video.open(buffer, CV_FOURCC('W', 'M', 'V', '2'), 30, Size(640, 480), true); //Creation of my video file from my webcam

        cout << "new recording in file: " << buffer << endl; //display the name of video file on the console
        record = true;
    }

Also your code skips the first frame, not sure if that's intentionally. 你的代码也会跳过第一帧,不确定是否有意。 You can fix that by changing the condition to if ((chrono == 0) && (record == false)) and then modifying the above fixes for resetting chrono to make sure it gets reset to 0 (instead of 1 or 2 ). 您可以通过将条件更改为if ((chrono == 0) && (record == false))然后修改上述修复程序来重置chrono以确保它重置为0 (而不是12 )来解决此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM