使用 OpenCV 仅在视频文件开头几秒钟提取帧
Posted
技术标签:
【中文标题】使用 OpenCV 仅在视频文件开头几秒钟提取帧【英文标题】:Frame Extraction Only few seconds in the beginning of video file using OpenCV 【发布时间】:2018-07-10 01:31:06 【问题描述】:在my previous question 之后,我想从视频中提取帧。但视频开始时只有 2 秒。 我想尽可能多地使用原始视频,这就是为什么我不想剪切原始视频然后对其进行处理。
这是我提取帧的代码。但这会从视频中提取所有帧:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <string>
#include <sstream>
using namespace cv;
using namespace std;
int c = 0;
string int2str(int &);
int main(int argc, char **argv)
string s;
VideoCapture cap("test_video.mp4");
if (!cap.isOpened())
cout << "Cannot open the video file" << endl;
return -1;
double fps = cap.get(CV_CAP_PROP_FPS);
cout << "Frame per seconds : " << fps << endl;
namedWindow("MyVideo", CV_WINDOW_NORMAL);
resizeWindow("MyVideo", 600, 600);
while (1)
Mat frame;
Mat Gray_frame;
bool bSuccess = cap.read(frame);
if (!bSuccess)
cout << "Cannot read the frame from video file" << endl;
break;
s = int2str(c);
//cout<<("%d\n",frame )<<endl;
c++;
imshow("MyVideo", frame);
imwrite("frame" + s + ".jpg", frame);
if (waitKey(30) == 27)
cout << "esc key is pressed by user" << endl;
break;
return 0;
string int2str(int &i)
string s;
stringstream ss(s);
ss << i;
return ss.str();
还有建议?谢谢。
【问题讨论】:
【参考方案1】:您似乎已经知道视频的 FPS。那么,在达到 FPS * 2 后,不只是计算提取和中断的帧数吗?
double fps = cap.get(CV_CAP_PROP_FPS);
int framesToExtract = fps * 2;
for (int frames = 0; frames < framesToExtract; ++frames)
... // your processing here
另外,我看了你之前的问题,好像你对 FPS 有误解?
FPS = 每秒帧数,这意味着视频每秒有多少帧。因此,假设您的视频是 120 FPS。这意味着一秒钟的视频有 120 帧,两秒钟有 240 帧,依此类推。
所以 (VIDEO_FPS * x) 可以得到视频 x 秒内的帧数。
【讨论】:
是的,我误解了 fps。现在我完全理解了。不,我没有关于视频输入的 FPS 的信息。 我以为double fps = cap.get(CV_CAP_PROP_FPS)
给了你视频的fps?
哦,是的,来自代码。我以为你是说我事先有关于我要处理的视频的信息。好的,我会试试你的建议。谢谢以上是关于使用 OpenCV 仅在视频文件开头几秒钟提取帧的主要内容,如果未能解决你的问题,请参考以下文章
Swift UITableView 仅在我按下几秒钟时调用 didSelectRowAt
如何使用 python 和 openCV 从 .yuv 视频文件 (YUV420) 中提取帧?