我正在使用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。
答案 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)
产生以下图像:
但是,plt.imshow(cap.read()[1])
生成以下图像:
此外,使用print(cap.read()[1])
显示该阵列的值不跨进程保持。因此,我得出结论,当宽度和高度为奇数个像素时,正在发生重采样过程(而不是简单的裁剪步骤)。