0

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

对于相同的图像,我会根据我想要的输出大小得到一个奇怪的输出。

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

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

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

由于这个问题在我的 Windows 上无法重现,我猜它要么在 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 一段时间。

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

欢迎任何信息

谢谢 !

4

1 回答 1

2

这是视频编码中的常见问题。如您所见,图像每行向左移动了一小部分。

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

所以图像将表示为

BGRBGR00
BGRBGR00

现在,如果编解码器不知道此填充,它将读取图像的宽度为 2,并将数据解释如下:

BGRBGR
00BGRB
0000BG // note the extra padding

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

640x480
1024x768
etc
于 2012-07-11T20:24:42.963 回答