如何堆叠多个图像numpy ndarray

tquggr8v  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(127)

我从opencv中获取图像numpy数组,然后我想将32张图像堆叠在一起,我想获得的最终形状是(3,32,image_height,image_width),下面是代码片段:

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/user/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/user/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


-----------更新-----------
感谢@abe的启发,下面的代码工作:

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

ffscu2ro

ffscu2ro1#

你得到的每帧图像都有一个形状(3, H, W),对吗?你想堆叠32个这样的图像。然后,你可以首先将image_np整形为image_np = image_np.reshape((3, 1, H, W)),然后是np.append(frame_buffer, image_np, axis=1),其中frame_buffer是用image_np的第一个整形示例初始化的。这应该会产生一个形状为(3, 32, H, W)的Tensor
或者,您可以初始化frame_buffer = np.zeros((3, 32, H, W)),并在每次迭代时初始化frame_buffer[:, i, :, :] = image_np

相关问题