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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:15:38