使用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!
答案 0 :(得分:2)
这是视频编码中的常见问题。正如您所看到的,图像移动了一小部分,每行都离开了。
如您所知,图像被保存为一长串字符:BGRBGRBGR .... 它还由其宽度和高度以及两个连续行之间的距离(以字节为单位)定义。一个天真的假设是步骤是3(通道)*宽度。但另外,出于内存对齐的原因,图像行用一些额外的位填充,以使步长值为4(通常)或16的倍数。原因是硬件编解码器加速与对齐数据一起工作 - 32位架构一次读取32位,对于SIMD处理,对齐的数据加载速度更快。
因此图像将表示为
BGRBGR00
BGRBGR00
现在,如果编解码器不知道这个填充,它会将图像的宽度读为2,并将按如下方式解释数据:
BGRBGR
00BGRB
0000BG // note the extra padding
为确保您不会遇到此问题,您应选择图像宽度,使步长值(通道*宽度)为四的倍数。所有标准分辨率都具有此属性,这是它们被选中的原因之一:
640x480
1024x768
etc