2D图像转3D时numpy数组transpose报axes don't match array错误求助
错误原因分析
你的代码触发这个错误主要有两个核心问题:
object_images列表未填充
循环读取帧后,你只做了保存图像的操作,完全没有把处理后的frame添加到object_images列表里。这会导致np.array(object_images)生成一个空数组,或者维度完全不符合预期的数组,后续执行transpose自然会报错。轴索引与数组实际维度不匹配
假设你补全了列表填充的步骤,cv2读取的彩色图像是**(height, width, 3)的三维数组,那么object_images_array的初始维度会是(num_frames, cube_height, cube_width, 3)**(4维数组)。而你执行transpose(1, 0, 2)只指定了3个轴索引,但数组本身有4个轴,轴数量不匹配,直接触发axes don't match array错误。
修复方案
根据你想要得到(cube_depth, cube_height, cube_width)的目标维度,按以下步骤调整代码:
补全列表填充逻辑
在循环里的cv2.imwrite之后,添加一行代码把帧存入列表:object_images.append(frame)调整数组维度与transpose参数
分两种情况处理:如果是生成灰度3D立方体:
在resize前把彩色帧转成灰度图,这样每个帧是2维数组,最终数组维度直接符合需求:# 在Resize前添加转灰度 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) frame = cv2.resize(frame, (cube_width, cube_height))此时
object_images_array的维度是(num_frames, cube_height, cube_width),也就是你要的(cube_depth, cube_height, cube_width),不需要执行transpose。如果要保留彩色通道(目标维度为
(cube_depth, cube_height, cube_width, 3)):
初始数组已经是这个维度,无需transpose;如果需要把通道维度移到最前面,用transpose(3, 0, 1, 2),得到(3, cube_depth, cube_height, cube_width)的数组。如果你确实需要调整轴顺序到
(cube_depth, cube_height, cube_width)(比如原数组维度是(cube_height, cube_width, cube_depth)),那要确保数组是3维的前提下,用transpose(2, 0, 1)来完成轴变换。
内容的提问来源于stack exchange,提问作者Ali Soleymani

