调用cv2.COLOR_BGR2GRAY转灰度图时出现axes don't match array错误
问题:OpenCV转灰度图时出现
axes don't match array错误 我能正常从摄像头读取帧:
success, image = self.video.read()
但当我尝试用以下代码将帧转为灰度模式时:
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
出现了如下错误:
im = im[..., ::-1].transpose((0, 3, 1, 2)) # BGR to RGB, BHWC to BCHW, (n, 3, h, w) ValueError: axes don't match array
更新代码
以下是我的完整相关代码:
类定义
class xyx(object): def __init__(self): ... def __del__(self): self.video.release() def get_frame(self): success, image = self.video.read() print(type(image)) # clean image = np.zeros((480,640,3), dtype=np.uint8) image = get_grayscale(image) ... #... x = ... #... return ...
工具函数
def get_grayscale(img): return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) def remove_noise(img): return cv2.medianBlur(img,5) def thresholdImg(img): return cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
说明:错误并非出在深层代码;不进行灰度转换时程序可正常运行,问题完全出在BGR转灰度图的步骤中。
问题原因及解决办法
核心原因:
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)会将原本3通道的彩色图像(形状为(480, 640, 3))转换成单通道灰度图(形状为(480, 640)),而后续代码中存在针对多通道图像的操作(比如错误栈里的transpose((0, 3, 1, 2)),该操作要求数组至少包含4个维度,或者至少能访问第3个索引),单通道图像的维度无法满足这个操作要求,因此抛出维度不匹配的错误。两种可行解决思路:
- 适配后续多通道要求:如果后续流程必须依赖3通道图像格式,将灰度图重新转换为3通道格式:
def get_grayscale(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将单通道灰度图转为3通道BGR格式 return cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) - 修改后续代码适配单通道:检查灰度转换之后的所有处理逻辑,将针对3通道图像的操作(比如通道翻转、维度转换)修改为兼容单通道的版本。例如,如果后续代码是在处理批量图像,需要确保单通道图像被正确扩展维度(比如增加通道维度,形状变为
(h, w, 1))。
- 适配后续多通道要求:如果后续流程必须依赖3通道图像格式,将灰度图重新转换为3通道格式:
内容的提问来源于stack exchange,提问作者Mohammed Baashar
相关产品推荐
相关产品推荐

