如何解决cv2.cvtColor()函数的scn == 1验证错误?
解决OpenCV cv::cvtColor的(-215) scn == 1 && (dcn == 3 || dcn == 4)错误
我来帮你搞定这个OpenCV的报错!这个错误提示其实已经把问题说得很清楚了:你传给cv2.cvtColor()的图像不是单通道灰度图,但cv2.COLOR_GRAY2RGB这个转换规则要求输入必须是单通道(也就是scn=1)的图像,否则就会触发这个断言错误。
咱们一步步来排查和解决:
1. 先确认加载的图像通道数
首先你得搞清楚loadWordsData加载出来的images[i]到底是什么通道的。在调用cv2.cvtColor()之前加一行打印,看看图像形状:
print(f"Image {i} shape: {images[i].shape}")
- 如果输出是
(高度, 宽度),那确实是单通道灰度图,这时候再排查其他问题; - 如果输出是
(高度, 宽度, 3),说明这已经是RGB三通道图像了,根本不需要再转一次; - 如果是
(高度, 宽度, 4),那是RGBA四通道图像,也不能直接用COLOR_GRAY2RGB转换。
2. 根据通道数调整代码逻辑
知道通道数后,咱们给代码加个判断,适配不同的图像类型:
images, labels = loadWordsData('data/test_words/' + LANG + '_raw', loadGaplines=False) for i in range(len(images)): printProgressBar(i, len(images)) img = images[i] # 处理不同通道的图像 if len(img.shape) == 2: # 单通道灰度图,转RGB img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) elif img.shape[2] == 3: # 已经是RGB,直接用 img_rgb = img elif img.shape[2] == 4: # RGBA转RGB img_rgb = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB) else: # 遇到其他通道数,直接抛出错误提示 raise ValueError(f"不支持的图像通道数:{img.shape[2]},请检查加载逻辑") # 执行归一化 images[i] = imageNorm(img_rgb, 60, border=False, tilt=True, hystNorm=True)
3. 检查loadWordsData的加载逻辑
另外你得确认下loadWordsData这个自定义函数是不是真的在加载灰度图。如果它内部是用cv2.imread()加载图像的话,默认会加载成BGR三通道图像,需要加上cv2.IMREAD_GRAYSCALE参数才能得到单通道灰度图。如果函数有参数可以指定加载模式,记得把它设为灰度模式。
这样调整之后,应该就能解决这个报错了。
内容的提问来源于stack exchange,提问作者Ahmad Raza
相关产品推荐
相关产品推荐

