cv2.VideoWriter从图像堆栈中切出一行像素

时间:2019-01-31 03:23:05

标签: python opencv

我正在使用cv2.VideoWriter()作为较大图像处理工作流程的中间步骤。基本上,我有一堆需要转换为延时拍摄的图像,然后处理其中的帧,然后将其用于下游以掩盖原始图像。我的遮罩无法正常工作,因为数组大小彼此不对应,并且我已经诊断出问题是由cv2.VideoWriter()引起的。我的延时组装过程来自here

关于cv2.VideoWriter()的大量帖子因帧大小错误等原因而无法正常工作。但是我的问题不是视频无法写-这是因为我的图像尺寸正在更改。实际上,我什至不确定上一行或下一行是被截断的内容,还是有一些潜在的重采样步骤或其他内容。

import cv2
import numpy as np
import glob

imgs = glob.glob('*.jpg')
img_array = []
for filename in imgs:
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width,height)
    img_array.append(img)

size # calling `size` returns (250,187)

out = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, size)

for i in range(len(img_array)):
    out.write(img_array[i])
out.release()


cap = cv2.VideoCapture('project.avi')
mycap = cap.read()
mycap[1].shape # this returns (186,250,3)

我希望mycap[1].shape具有与size相同的属性,但是size表示我有一个250像素宽和187像素高的阵列,mycap[1].shape显示该视频的尺寸为250x186。

1 个答案:

答案 0 :(得分:0)

经过一些测试,我确认cv2.VideoWriter()不仅仅是剪切具有奇数维值的图像,而是在更改维数的同时更改数组中的值:

import numpy as np
import pylab as plt
import cv2 as cv

# Create RGB layers
r = np.array([[255, 0, 255, 0, 255, 0, 255, 0, 255], [255, 0, 255, 0, 255, 0, 255, 0, 255], [255, 0, 255, 0, 255, 0, 255, 0, 255]],dtype=np.uint8)
g = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]],dtype=np.uint8)
b = np.array([[10, 0, 10, 0, 10, 0, 255, 0, 255], [10, 0, 10, 0, 10, 0, 255, 0, 255], [10, 0, 10, 0, 10, 0, 255, 0, 255]],dtype=np.uint8)

# Create a few image layers
rgb1 = np.dstack((r,g,b))
rgb2 = np.dstack((r,g,b))
rgb3 = np.dstack((r,g,b))
rgb4 = np.dstack((r,g,b))

plt.imshow(rgb1)

imgs = [rgb1,rgb2,rgb3,rgb4]

# Create timelapse
img_array = []
for img in imgs:
    height, width, layers = img.shape
    size = (width,height)
    img_array.append(img)


out = cv.VideoWriter('SO_question.avi',cv.VideoWriter_fourcc(*'DIVX'), 15, size)

for i in range(len(img_array)):
    out.write(img_array[i])
out.release()


# Read video in
cap = cv.VideoCapture('SO_question.avi')
cap.read()[1].shape
plt.imshow(cap.read()[1])

plt.imshow(rgb1)产生以下图像:

rgb1 image

但是,plt.imshow(cap.read()[1])生成以下图像:

video image

此外,使用print(cap.read()[1])显示该阵列的值不跨进程保持。因此,我得出结论,当宽度和高度为奇数个像素时,正在发生重采样过程(而不是简单的裁剪步骤)。