Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV在内存中加载视频_C++_Opencv - Fatal编程技术网

C++ OpenCV在内存中加载视频

C++ OpenCV在内存中加载视频,c++,opencv,C++,Opencv,使用cv::VideoCapture从磁盘读取视频时,会发生什么情况 在内存中读取整个文件,然后逐帧解码 直接为磁盘逐帧提取 如果第二个选项是答案,那么是否可以用第一种方法实现呢?要在Linux上用Python实现这一点,我只需将输入文件复制到/dev/shm,这是一个RAM支持的文件系统 tempdir = tempfile.TemporaryDirectory(dir='/dev/shm') copypath = os.path.join(tempdir.name, os.path.base

使用
cv::VideoCapture
从磁盘读取视频时,会发生什么情况

  • 在内存中读取整个文件,然后逐帧解码
  • 直接为磁盘逐帧提取

  • 如果第二个选项是答案,那么是否可以用第一种方法实现呢?

    要在Linux上用Python实现这一点,我只需将输入文件复制到
    /dev/shm
    ,这是一个RAM支持的文件系统

    tempdir = tempfile.TemporaryDirectory(dir='/dev/shm')
    copypath = os.path.join(tempdir.name, os.path.basename(args.video))
    shutil.copy(args.video, copypath)
    args.video = copypath
    

    当然,拷贝操作也会有成本,但它不应该仅仅是读取整个文件(因为拷贝的另一端没有写入的慢速磁盘)。

    具体的答案可能取决于使用的是哪个后端。然而,在大多数情况下,1似乎是一种相当愚蠢的方法。为什么要加载整个内容,而只按顺序处理?想象一下,这在32位平台上会有多好。也就是说,我在OpenCV代码中没有看到任何关于这方面的规定,如果您使用ffmpeg后端,您需要为此编写自己的解码器(例如[参见此](stackoverflow.com/questions/5237175/从内存缓冲区处理视频流)。你想解决什么具体情况?谢谢。。。我的场景是,我想处理一个视频,而我不关心它需要多少时间才能完全加载到内存中。然而,在那之后,我想要极高的速度,所以我更喜欢从内存中读取帧,而不是从磁盘逐帧读取。我希望解码的开销比读取的开销更大。如果所有的帧都能被解压到内存中,我会在第一遍将整个视频读入Mat对象的向量中,然后进行处理。这可能是实现您描述的最简单的方法。@DanMašek谢谢您的帮助,您可以将其添加为答案,以便我可以接受。