C++ OpenCV VideoWriter占用的时间太长

C++ OpenCV VideoWriter占用的时间太长,c++,macos,opencv,C++,Macos,Opencv,我有一个简单的应用程序,使用OpenCV 2.4.7(在Mac OS Mavericks中使用gcc 4.7.2编译)从图像集合创建视频: std::vector文件名=…;//图像文件名 常数int FPS=25; 常数cv::大小SZ(640896); 录像机视频; video.open(“video.avi”、CV_FOURCC(“m”、“p”、“4”、“v”)、FPS、SZ、true); if(video.isOpened()) { 对于(size_t i=0;i

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

std::vector文件名=…;//图像文件名
常数int FPS=25;
常数cv::大小SZ(640896);
录像机视频;
video.open(“video.avi”、CV_FOURCC(“m”、“p”、“4”、“v”)、FPS、SZ、true);
if(video.isOpened())
{
对于(size_t i=0;i如果(!im.empty())video我的设置可能与你的完全不同,但这是我的设置。你能发布更多关于设置、编解码器等的详细信息吗

  • 视窗7
  • 直接从XVID站点安装的XVID编解码器
  • OpenCV 2.4.3
这在我看来并不正常。下面是一个使用opencv和python的简单视频编写器。对于640x480(黑色)图像,10000帧的写入时间直方图范围为~0到2ms

屈服

  • 帧数:10000
对于帧计数:帧时间

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

我没有做图表,但如果你愿意,我可以做。

我没有答案,只有一个隔离问题-如果在许多帧后你做了一个新的
视频。打开
性能重置了吗?在我看来,这可能有助于指出可能出现的问题。我想如果我重新打开文件,我会丢失视频的第一部分。我是说打开一个新的文件。重点是检查问题是否是由于视频中的许多帧造成的,或者是由于多次调用写入方法后写入方法本身中的其他内容造成的。您的图像有多大?我正在尝试在python上用opencv复制它,但到目前为止没有速度减慢。图像是640x896。通过重新锁定文件中,执行时间又从几毫秒开始。因此,它可能与
VideoWriter
有关,谢谢您的检查。我使用的编解码器是我见过的唯一一个可以在Mac中使用的编解码器,它是随附的。我试过使用divx和xvid,执行时间似乎保持稳定,但没有生成可读视频ced。@ChronoTrigger您是否尝试过将FOURCC参数设置为
-1
,然后尝试了所有/某些其他选项以进行比较?关于可读视频,我发现即使生成零帧,它也不会抱怨,所以请注意伪补全。
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_)