使用 OpenCV C++ 每 1 分钟创建新的视频文件

create new video file every 1 minutes with opencv c++

本文关键字:创建 的视频 文件 分钟 OpenCV C++ 使用      更新时间:2023-10-16

我正在用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;
}
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将被2record将被false,因此您的代码将永远不会再次记录(因为(chrono == 1) && (record == false)永远不会被true(。您需要在该 if 正文中将chrono设置为0,以便之后递增到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(而不是12(。