You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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个索引),单通道图像的维度无法满足这个操作要求,因此抛出维度不匹配的错误。

  • 两种可行解决思路:

    1. 适配后续多通道要求:如果后续流程必须依赖3通道图像格式,将灰度图重新转换为3通道格式:
      def get_grayscale(img):
          gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          # 将单通道灰度图转为3通道BGR格式
          return cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
      
    2. 修改后续代码适配单通道:检查灰度转换之后的所有处理逻辑,将针对3通道图像的操作(比如通道翻转、维度转换)修改为兼容单通道的版本。例如,如果后续代码是在处理批量图像,需要确保单通道图像被正确扩展维度(比如增加通道维度,形状变为(h, w, 1))。

内容的提问来源于stack exchange,提问作者Mohammed Baashar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:17:10