Python 在Opencv中使用WriteName的奇怪行为

Python 在Opencv中使用WriteName的奇怪行为,python,video,opencv,Python,Video,Opencv,我在使用OpenCV的视频创建功能时遇到了一个小问题 对于相同的图像,我得到一个奇怪的输出,这取决于我想要的输出大小 下面是一个我能得到的结果的例子 我在不同的计算机上尝试了几组不同的图像。 它似乎在Windows上运行良好,我对Ubuntu软件包中附带的Opencv(当前版本为2.3.1-7)也有问题 由于这个问题在我的windows上是不可复制的,我想它要么是在2.4中修复的,要么是特定于Linux的 下面是一个(python)测试代码,它突出了问题: import os import c

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

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

下面是一个我能得到的结果的例子

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

由于这个问题在我的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 !"
我担心的是,根据输出的大小,视频是好的(例如652498是可以的)。 无论我使用什么编解码器,行为都是一样的

如果没有修复,我想了解更多关于此错误原因的信息。 由于我想推出Ubuntu,我最好使用他们的打包系统,并将2.3版保留一段时间

因此,我想知道如何通过选择受过教育的尺码,明智地解决这个问题

欢迎提供任何信息


谢谢

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

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

因此,图像将表示为

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

BGRBGR
00BGRB
0000BG // note the extra padding
为确保不会出现此问题,应选择图像宽度,使步长值(通道*宽度)为四的倍数。所有标准分辨率都具有此属性,这也是选择它们的原因之一:

640x480
1024x768
etc

+1-
所有标准分辨率都具有此属性,这也是选择这些分辨率的原因之一。我一直在想为什么会有这种奇怪的数字,这对我来说真的很新鲜。谢谢你的回答!我确实知道编码,并注意到视频中添加的常规填充,但从未与SIMD指令和常见分辨率建立实际关系。那我就试着找一对最亲密的夫妻。谢谢