создавайте новый видеофайл каждые 1 минуту с помощью opencv c ++ - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над маленькой "Dashcam" с opencv.Принцип прост - каждую минуту я хочу создать новый видеофайл с текущей датой и временем.Содержимое этих видеофайлов - это кадр веб-камеры.

Однако по прошествии первой минуты видео больше не генерируется.

Вот мой закомментированный код:

#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;
}

1 Ответ

0 голосов
/ 05 июня 2018
    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

После этого chrono будет 2, а record будет false, поэтому ваш код больше никогда не будет записываться (потому что (chrono == 1) && (record == false) никогда не будет true).Вам нужно установить chrono в 0 в этом if-теле, чтобы оно впоследствии увеличивалось до 1, или переместить приращение в тело if (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
        chrono++; //incrementation of the chrono
    }

(и уберите chrono++ дальше вниз)

Или:

    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

На узле сайта в настоящее время вы не создаете новое видео каждую минуту, а добавляете к тому же видео.Возможно, вы захотите переместить строки, создающие ваш VideoWriter в ваш цикл, особенно внутри if ((chrono == 1) && (record == false)).Вне цикла просто оставьте VideoWriter video; и используйте 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;
    }

Также ваш код пропускает первый кадр, не уверенный, намеренно ли это.Это можно исправить, изменив условие на if ((chrono == 0) && (record == false)), а затем изменив вышеуказанные исправления для сброса chrono, чтобы убедиться, что оно сбрасывается на 0 (вместо 1 или 2).

...