在Opencv中使用writeFrame的奇怪行为

时间:2012-07-11 20:01:16

标签: python video opencv

使用OpenCV的视频创建功能我遇到了一个小问题。

对于相同的图像,我得到一个奇怪的输出,具体取决于我想要的输出大小。

以下是我可以获得的结果示例。

http://www.youtube.com/watch?v=1wm8VjyfdyA&feature=youtu.be

我尝试了几套不同的图像,并在不同的计算机上。 它似乎在Windows上运行良好,我在Ubuntu软件包中提供的Opencv存在问题(当前2.3.1-7)。

由于问题在我的窗口上无法重现,我想它可以在2.4中修复,也可以在Linux上修复。

这是一个突出问题的(python)测试代码:

import os
import cv

in_dir = "../data/inputs/sample-test"
out = "output.avi"


# loading images, create Guys and store it into guys
frameSize = (652, 498)
#frameSize = (453, 325)
fourcc = cv.CV_FOURCC('F', 'M', 'P', '4')
my_video = cv.CreateVideoWriter(out, 
                              fourcc, 
                              15, 
                              frameSize,
                              1)

for root, _, files in os.walk(in_dir):
    for a_file in files:
        guy_source = os.path.join(in_dir, a_file)
        print guy_source
        image = cv.LoadImage(guy_source)

        small_im = cv.CreateImage(frameSize, 
                                  image.depth ,
                                  image.nChannels)        
        cv.Resize(image, small_im, cv.CV_INTER_LINEAR)
        cv.WriteFrame(my_video, small_im)

print "Finished !"

我担心的是,根据输出大小,视频很好(例如652,498就可以了)。 无论使用什么编解码器,行为都是一样的。

如果不是修复,我想了解有关此错误原因的更多信息。 由于我想为Ubuntu发货,我最好使用他们的包装系统并保留2.3一段时间。

所以我想知道如何通过选择受过教育的尺寸来明智地解决问题。

欢迎提供任何信息

Thx!

1 个答案:

答案 0 :(得分:2)

这是视频编码中的常见问题。正如您所看到的,图像移动了一小部分,每行都离开了。

如您所知,图像被保存为一长串字符:BGRBGRBGR .... 它还由其宽度和高度以及两个连续行之间的距离(以字节为单位)定义。一个天真的假设是步骤是3(通道)*宽度。但另外,出于内存对齐的原因,图像行用一些额外的位填充,以使步长值为4(通常)或16的倍数。原因是硬件编解码器加速与对齐数据一起工作 - 32位架构一次读取32位,对于SIMD处理,对齐的数据加载速度更快。

因此图像将表示为

BGRBGR00
BGRBGR00

现在,如果编解码器不知道这个填充,它会将图像的宽度读为2,并将按如下方式解释数据:

BGRBGR
00BGRB
0000BG // note the extra padding

为确保您不会遇到此问题,您应选择图像宽度,使步长值(通道*宽度)为四的倍数。所有标准分辨率都具有此属性,这是它们被选中的原因之一:

640x480
1024x768
etc