使用cv2分割文本图片时报错(-215:Assertion failed) !_src.empty()
解决OpenCV cv::cvtColor断言失败错误(!_src.empty())
我尝试用OpenCV将文本图片分割并保存为文件,运行代码时弹出如下错误:
cv2.error: OpenCV(4.5.2) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-ttbyx0jz\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
使用的代码如下:
import cv2 for i in range(1000): img = cv2.imread('original/%s.png' %i) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for j in range(5): crop_img = gray[0:50, 8+j*26:8+(j+1)*26] cv2.imwrite("splited/%s_%s.png"%(i, j), crop_img) print(i)
我已检查过图片路径,部分图片显示正常(为包含数字的文本图片),求助解决该错误。
问题原因与解决办法
这个错误的核心是cv2.imread未成功读取到图片,返回了空对象(None),导致后续cvtColor处理空图像触发断言失败。
1. 循环范围内存在不存在的图片
你循环了range(1000),但original目录下大概率没有0到999的所有.png文件,当i指向不存在的文件时,img就会变成None。
解决:遍历目录内实际存在的文件,而非固定循环次数:
import cv2 import glob # 获取original目录下所有png文件 img_paths = glob.glob('original/*.png') for img_path in img_paths: # 提取文件名中的数字部分(假设文件名格式为数字.png) file_name = img_path.split('/')[-1] i = file_name.split('.')[0] img = cv2.imread(img_path) if img is None: print(f"跳过无法读取的文件: {img_path}") continue gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for j in range(5): crop_img = gray[0:50, 8+j*26:8+(j+1)*26] cv2.imwrite(f"splited/{i}_{j}.png", crop_img) print(i)
2. 相对路径工作目录不匹配
即使你认为路径正确,也可能因为运行代码的工作目录不对,导致cv2.imread找不到文件。
解决:使用绝对路径或切换到正确工作目录:
import os import cv2 # 切换到代码所在的目录 os.chdir(os.path.dirname(os.path.abspath(__file__))) # 后续代码按原逻辑执行,添加空图像判断 for i in range(1000): img = cv2.imread(f'original/{i}.png') if img is None: print(f"无法读取图片: original/{i}.png") continue gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for j in range(5): crop_img = gray[0:50, 8+j*26:8+(j+1)*26] cv2.imwrite(f"splited/{i}_{j}.png", crop_img) print(i)
3. 图片文件损坏
部分图片看起来正常但实际损坏,导致cv2.imread无法读取。
解决:在读取后添加空值判断,跳过异常图片:
import cv2 for i in range(1000): img = cv2.imread('original/%s.png' %i) # 检查图片是否读取成功 if img is None: print(f"无法读取图片: original/{i}.png") continue gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for j in range(5): crop_img = gray[0:50, 8+j*26:8+(j+1)*26] cv2.imwrite("splited/%s_%s.png"%(i, j), crop_img) print(i)
内容的提问来源于stack exchange,提问作者Suns Bread
相关产品推荐
相关产品推荐

