使用 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 仅在视频文件开头几秒钟提取帧的主要内容,如果未能解决你的问题,请参考以下文章

Safari 10 上的视频标签在几秒钟后上升

OpenCV VideoWriter 帧率问题

Swift UITableView 仅在我按下几秒钟时调用 didSelectRowAt

如何使用 python 和 openCV 从 .yuv 视频文件 (YUV420) 中提取帧?

office DocumentBeforeSave事件仅在几秒钟内绑定后才能工作

无法使用 C++ 和 OpenCV 从视频中提取帧