OpenCV VideoWriter 耗时太长

Posted

技术标签:

【中文标题】OpenCV VideoWriter 耗时太长【英文标题】:OpenCV VideoWriter taking too long 【发布时间】:2014-02-25 15:51:01 【问题描述】:

我有一个简单的应用程序,它使用 OpenCV 2.4.7(在 Mac OS Mavericks 中使用 gcc 4.7.2 编译)从图像集合中创建视频:

std::vector<std::string> filenames = ...; // image filenames

const int FPS = 25;
const cv::Size SZ(640, 896);
cv::VideoWriter video;
video.open("video.avi", CV_FOURCC('m', 'p', '4', 'v'), FPS, SZ, true);

if(video.isOpened())

   for(size_t i = 0; i < filenames.size(); ++i)
   
     cv::Mat im = cv::imread(filenames[i], 1);
     if(!im.empty()) video << im;
   

我只分析命令video &lt;&lt; im,我发现随着视频中帧数的增加,它需要的时间越来越长。一开始,每张图像的添加时间不到 5 毫秒。 1万张图像后,每张图像需要100毫秒,2万张图像后,大约需要170毫秒。与此同时,“video.avi”文件正在创建和增长中。

使用另一组图像(相同大小和格式),我在 10000 张图像后每张图像获得最多 3.5 秒。

我的问题是:这种行为正常吗?

【问题讨论】:

我没有答案,只是一个孤立的问题——如果在很多帧之后你执行一个新的video.open,性能会重置吗?在我看来,这将有助于指出可能出了什么问题。 我猜如果我重新打开文件,我会丢失视频的第一部分。 我的意思是打开一个新文件。重点是检查问题是由于视频中的帧数过多造成的,还是由于多次调用后write方法本身的其他原因造成的。 您的图片有多大?我正在尝试在 python 上使用 opencv 重现它,到目前为止我没有减速。 图片为 640x896。通过重新处理文件,执行时间再次从几毫秒开始。所以它可能与VideoWriter 【参考方案1】:

我的设置可能与您的完全不同,但这就是我所拥有的。您能否发布有关您的设置、编解码器等的更多详细信息?

Windows 7 直接从 xvid 站点安装的 XVID 编解码器 OpenCV 2.4.3

这对我来说似乎不正常。下面是一个带有 opencv 和 python 的简单视频编写器。对于 640x480(黑色)图像,10,000 帧的写入时间直方图范围为 ~0 到 2ms。

from collections import deque
import os
import time

import cv2
from cv2 import cv
import numpy

images_directory = 'images'
output_name = 'video.avi'
fps = 25
size = (640, 480)
is_color = True
frames_to_produce = 10000
write_times = deque()
writer = cv2.VideoWriter(output_name, -1, fps, size, is_color)
# writer = cv2.VideoWriter(output_name, cv.CV_FOURCC('x', 'v', 'i', 'd'),
#                          fps, size, is_color)

if writer.isOpened():
    for i in xrange(frames_to_produce):
        filename = os.path.join(images_directory, str(i % 10) + '.png')
        image = cv2.imread(filename)
        if image is not None:
            write_time_start = time.time()
            writer.write(image)
            write_times.append(time.time() - write_time_start)

print 'frames: '.format(len(write_times))
histogram = numpy.histogram(write_times, bins=5)
for count, bin_ in zip(*histogram):
    print '0: 1:.5f'.format(count, bin_)

产量

帧数:10000

对于帧数:帧时间

1987: 0.00000 6108: 0.00060 0:0.00120 1891: 0.00180 14: 0.00240

我还没有绘制图表,但如果你愿意,我可以。

【讨论】:

感谢您的检查。我正在使用的编解码器是我见过的唯一一个可以在 Mac 中使用的编解码器,它是随它一起提供的。我尝试了 divx 和 xvid,执行时间似乎保持稳定,但没有生成可读的视频。 @ChronoTrigger 您是否尝试过 -1 的 FOURCC 参数,然后尝试了所有/一些其他选项进行比较?关于可读视频,我发现即使它产生零帧也不会抱怨,所以要注意虚假完成。

以上是关于OpenCV VideoWriter 耗时太长的主要内容,如果未能解决你的问题,请参考以下文章

OPENCV,无法打开类 VideoWriter

opencv-videowriter

使用opencv中的VideoWriter函数,保存视频

OpenCV VideoWriter 不写任何东西

OpenCV:来自 VideoWriter 的写入是不是应该在独立线程中运行?

OpenCV 填充垫,与 VideoWriter 一起使用