使用 opencv 从文件中更改视频捕获的 FPS

Change FPS on video capture from file with opencv

我正在读取一个视频文件,它比文件的实际 FPS (59 FPS @1080p) 慢,即使我没有对图像进行任何处理也是如此:

       using namespace cv;
       using namespace std;
       // Global variables
        UMat frame; //current frame
        int main(int argc, char** argv)
        {

                VideoCapture capture("myFile.MP4");
                namedWindow("Frame");
                capture.set(CAP_PROP_FPS, 120); //not changing anything
                cout>>capture.get(CAP_PROP_FPS);
                while (charCheckForEscKey != 27) {

                       capture >>frame;
                if (frame.empty())
                    break;
                imshow("Frame", frame);

                }

    }

即使我尝试将 CAP_PROP_FPS 设置为 120,它也不会更改文件的 fps,当我得到 (CAP_PROP_FPS) 时,我仍然得到 59.9...

当我阅读视频时,实际结果大约是 54 FPS(即使使用 UMat)。

有没有办法以更高的 FPS 速率读取文件?

我也在opencv问答网站上问了他问题:http://answers.opencv.org/question/117482/change-fps-on-video-capture-from-file/

是不是因为我的电脑太慢了?

TL;DR FPS 与问题无关,可能是性能问题

FPS 有什么用? 在显示单帧视频之前,您必须读取数据(从 HDD、DVD、网络、Internet 或其他任何设备)并对其进行解码。这两个操作都需要时间,时间长短因系统而异,具体取决于 HDD/Internet 的速度、处理器速度等。如果我们在每一帧准备就绪后立即显示,那么最终的电影速度将会,因此,因系统而异。这通常不是我们想要的,因此随着视频帧的序列,我们得到 "frames per second" 值(又名 FPS),它告诉我们应该多快显示每个连续的帧(每 1/30 帧显示一次)每秒 30 帧,每 1/60 秒一次,每秒 60 次,等等)如果帧已准备好显示但为时过早,我们可以等到它的时间到来。如果到了显示帧的时间但它还没有准备好(在 underpowered/too 繁忙的系统上),我们无能为力(在某些情况下可能会丢帧)。要亲自查看效果,请尝试将 FPS 值更改为 x2,保存文件并使用 VLC 显示:对于相同的数据量和相同的帧数,您会注意到视频的速度增加了一倍,时间也增加了一倍-减半。尝试为您的 x2 FPS 将每个帧写入两次 - 您将看到播放速度恢复正常(帧数增加一倍,文件大小无意义地增加)。

FPS有什么用? 在处理(不显示)视频时,我们不受原始FPS的限制,处理得越快越好。如果您的 PC 每秒可以处理 1000 帧 - 很好,如果 1500 - 更好。不用说,更改文件中的 FPS 值不会提高您的 CPU/HDD 速度,因此如果您每秒只能处理 54 帧,您仍然只能每秒处理 54 帧.

但是VLC怎么显示得更快呢?假设你没有忘记在测量时间之前从Debug切换到Release build,那么还有很多可能性:VLC可能是针对视频播放的特定任务进行了更好的优化(OpenCV 在某些任务上并不是那么快,而且它必须将每个帧转换为更通用的 Mat/UMat 结构),多线程(包括 "double buffering",如前所述在评论中)是另一个可能的原因,也可能是缓存(例如,一次从 HDD 读取包含许多帧的数据块,而不是逐帧读取和处理帧)。