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

时间:2016-12-07 19:18:10

标签: c++ opencv video frame-rate

即使我没有对图片进p>

       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 Q& A网站上问他问题:http://answers.opencv.org/question/117482/change-fps-on-video-capture-from-file/

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

1 个答案:

答案 0 :(得分:1)

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

使用什么FPS?在显示单帧视频之前,您必须读取数据(来自HDD,DVD,网络,互联网等)并对其进行解码。这两种操作都需要时间,其数量因系统而异,具体取决于HDD / Internet的速度,处理器速度等。如果我们只是在它准备就绪后立即显示每一帧,则产生的电影速度因此,将因系统而异。这通常不是我们想要的,所以随着视频帧的序列,我们得到每秒#34;帧#34;值(又称FPS),它告诉我们多久我们将显示每个连续帧(30 FPS每1/30秒一次,60 FPS每1/60秒一次,等等)框架已准备就绪,但现在还为时尚早,我们可以等到它的时间到来。如果现在是时候显示一个帧但它还没有准备好(在功能不足/太忙的系统上),那么我们无能为力(在某些情况下可能会丢帧)。要查看自己的效果,请尝试更改x2的FPS值,保存文件并使用VLC显示:对于相同数量的数据和相同数量的帧,您会注意到视频的速度加倍并且时间 - 减半尝试为x2 FPS两次写入每个帧 - 您将看到播放速度恢复正常(帧数增加一倍,文件大小无意义地增加)。

不使用什么FPS?处理(不显示)视频时,我们不受原始FPS的限制,处理速度尽可能快。如果您的PC可以处理每秒1000帧 - 好的,如果1500帧 - 甚至更好。毋庸置疑,更改文件中的FPS值不会提高CPU / HDD速度,因此如果您只能处理每秒54帧,那么您仍然只能处理每秒54帧

但是VLC如何更快地显示?假设您在测量时间之前没有忘记从Debug转换为Release版本,那么仍有许多可能性:VLC可能更适合于视频播放的特殊任务(OpenCV在某些任务中并不是那么快,加上它必须将每个帧转换为更通用的Mat / UMat结构),多线程(包括"双缓冲",如上所述)注释)是另一个可能的原因,也许是缓存(例如,一次从HDD读取包含许多帧的数据块,而不是逐个读取和处理帧)。