调用cv2.cvtColor报错不支持输入图像深度为3(CV_16S)如何解决?
问题原因及解决方案
报错核心原因
你遇到的报错和用什么工具读取视频没有关系,根源是两个问题:
- 数组数据类型不符合OpenCV接口要求:
你在读取视频时将数组强制转换为np.int16(对应OpenCV的CV_16S有符号16位整型),而cv.COLOR_BGR2GRAY接口仅支持3种输入深度:CV_8U(无符号8位,对应numpy的np.uint8,数值范围0-255)CV_16U(无符号16位,对应numpy的np.uint16,数值范围0-65535)CV_32F(32位浮点数,对应numpy的np.float32,数值范围0-1)
报错信息里的VDepth::contains(depth)校验失败就是因为输入的CV_16S不在支持列表内。
- 通道顺序不匹配:
skvideo.io.vread默认返回的帧是RGB通道顺序,而你用的COLOR_BGR2GRAY是针对BGR顺序的图像设计的,就算解决了类型问题,转换出来的灰度图权重也会出错。
解决方案
不需要更换为cv2.VideoCapture,用以下任意一种方法即可解决:
- 方案1:转成常用的8位无符号整型(适合普通8位深度的视频)
# 提取帧后先转类型,直接用RGB转灰度的接口无需调整通道顺序 img = video[0].astype(np.uint8) gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
- 方案2:保留16位精度(如果原视频是16位深度)
如果你的视频本身是16位深度,且数值范围没有负数,可以直接转成无符号16位:
img = video[0].astype(np.uint16) gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
- 方案3:手动计算灰度值,完全避开OpenCV的类型限制
# 按RGB转灰度的标准公式计算,不需要调整类型和通道顺序 gray = 0.299 * img[...,0] + 0.587 * img[...,1] + 0.114 * img[...,2] # 计算结果可以根据需要再转成对应类型 gray = gray.astype(np.uint8)
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

