c++ - OpenCV VideoWriter 花费的时间太长

标签 c++ macos opencv

我有一个简单的应用程序,它使用 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 << im而且我已经看到随着视频中帧数的增加,它花费的时间越来越长。一开始,每张图片的添加时间不到 5 毫秒。 1 万张图像后,每张图像需要 100 毫秒,2 万张图像后,大约 170 毫秒。同时,文件“video.avi”正在创建和增长。

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

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

最佳答案

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

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

我觉得这不正常。下面是一个使用 opencv 和 python 的简单视频编写器。对于 640x480(黑色)图像,10,000 帧的写入时间直方图范围从 ~0 到 2 毫秒。

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

我还没有画过图表,但如果你想让我画,我可以画。

关于c++ - OpenCV VideoWriter 花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22019345/

相关文章:

c++ - 在 OSX 上将我的代码与 ARPACK 链接时出现问题(将 MacPorts 用于 ARPACK)

c++ - 访问负像素值 OpenCV

c++ - 用复数解析表达式

c++ - 如何在 OSX 上的 C++ 应用程序中播放合成器声音?

c++ - 如何在 Qt 样式表中创建阴影?

Python 在 Mac 上意外退出

opencv - 边缘检测iPhone OpenCV

opencv - 增加相机的fps?

c++ - 调用派生类的模板函数

c++ - 无法使用 GLFW 设置 GL 标志