создавайте новый видеофайл каждые 1 минуту с помощью opencv Stack Overflow

Я работаю над маленькой «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;
}

3

Решение

    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).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]