Python 如何将多个图像按numpy ndarray进行堆叠
我从opencv获取图像numpy数组,然后我想将32个图像堆叠在一起,我想得到的最终形状是(3,32,图像高度,图像宽度),下面是代码片段:Python 如何将多个图像按numpy ndarray进行堆叠,python,numpy,numpy-ndarray,opencv-python,Python,Numpy,Numpy Ndarray,Opencv Python,我从opencv获取图像numpy数组,然后我想将32个图像堆叠在一起,我想得到的最终形状是(3,32,图像高度,图像宽度),下面是代码片段: import cv2 import numpy as np video_path = 'xxxx.mp4' frame_buffer = np.array([]) frame_index = 0 frame_buffer_num = 0 cap = cv2.VideoCapture(video_path) while True: ret, image
import cv2
import numpy as np
video_path = 'xxxx.mp4'
frame_buffer = np.array([])
frame_index = 0
frame_buffer_num = 0
cap = cv2.VideoCapture(video_path)
while True:
ret, image_np = cap.read()
print(image_np.shape)
if frame_index == 0:
frame_buffer = image_np # initialize empty frame_buffer
frame_index += 1
frame_buffer_num += 1
continue
frame_index += 1
frame_buffer_num += 1
frame_buffer = np.stack(frame_buffer, image_np)
if frame_buffer_num == 32:
print(frame_buffer.shape)
break
我运行了它,但出现以下错误:
Traceback (most recent call last):
File "/home/weidawang/Python/temp.py", line 19, in <module>
frame_buffer = np.stack(frame_buffer, image_np)
File "<__array_function__ internals>", line 6, in stack
File "/home/weidawang/miniconda3/lib/python3.7/site-packages/numpy/core/shape_base.py", line 430, in stack
axis = normalize_axis_index(axis, result_ndim)
TypeError: only size-1 arrays can be converted to Python scalars
每个帧的图像都有一个形状
(3,H,W)
,对吗?你想把其中的32个叠起来。然后,您可以首先将image\u np
整形为image\u np=image\u np.resporate((3,1,H,W))
,然后np.append(frame\u buffer,image\u np,axis=1)
其中frame\u buffer
是用image\u np
的第一个整形实例初始化的。这将产生一个具有形状的张量(3,32,H,W)
或者,您可以初始化
frame\u buffer=np.zero((3,32,H,W))
并且在每次迭代时,frame\u buffer[:,i,:,:]=image\u np
您为每个帧获得的图像都有一个形状(3,H,W)
对吗?你想把其中的32个叠起来。然后,您可以首先将image\u np
整形为image\u np=image\u np.resporate((3,1,H,W))
,然后np.append(frame\u buffer,image\u np,axis=1)
其中frame\u buffer
是用image\u np
的第一个整形实例初始化的。这将产生一个具有形状的张量(3,32,H,W)
或者,您可以初始化
frame\u buffer=np.zero((3,32,H,W))
并在每次迭代时,frame\u buffer[:,i,:,:]=image\u np
感谢您提供了如此巧妙和可行的解决方案!我已经用另一种方法成功地完成了它。我从opencv得到的实际上是(H,W,3),但这不是一个大问题。我可以添加一行代码:image\u np=image\u np.重塑(3,H,W)
@WadeWANG不客气:)感谢您提供如此巧妙可行的解决方案!我已经用另一种方法成功地完成了它。我从opencv得到的实际上是(H,W,3),但这不是一个大问题。我可以添加一行代码:image\u np=image\u np.重塑(3,H,W)
@WadeWANG不客气:)
import cv2
import numpy as np
video_path = 'xxxx.mp4'
frame_index = 0
frame_buffer_num = 0
cap = cv2.VideoCapture(video_path)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # float
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
frame_buffer = np.zeros((3, 32, int(height), int(width)))
while True:
ret, image_np = cap.read()
image_np = image_np.reshape(3, int(height), int(width))
print(image_np.shape)
frame_buffer[:, frame_buffer_num, :, :] = image_np
frame_index += 1
frame_buffer_num += 1
if frame_buffer_num == 32:
print(frame_buffer)
print(frame_buffer.shape)
break