OpenCV路径扩展名正确时转换图像色彩空间出现_src.empty错误求解
问题根因与修复方案
触发报错的核心逻辑
你遇到的!_src.empty()报错本质是cv2.cvtColor接收的输入图像为空,也就是cv2.imread读取对应文件时返回了None,以下是几种最常见的触发原因:
- 你写的
convert_from_folder_to_images函数存在缩进错误:遍历PDF页面的for j循环没有放在PDF遍历的for i循环内部,循环时每次都会覆盖pages变量,仅最后一个PDF的页面会被正常保存,其他PDF对应生成的图片要么不存在、要么是空文件,cv2.imread读取这类无效文件自然返回空。 - OpenCV默认不支持CMYK色彩模式的JPG文件:pdf2image从扫描PDF导出的图片可能为CMYK模式,这类文件可以在普通图像查看器中正常打开,但
cv2.imread直接读取会返回None。 - 路径拼接不规范:直接使用字符串拼接路径,Windows环境下如果路径包含特殊字符、空格或分隔符匹配异常,会导致
cv2.imread找不到对应文件。 - 渐进式JPG兼容问题:旧版本OpenCV不支持读取渐进式编码的JPG文件,pdf2image导出时可能生成这类编码的图片。
修复代码
1. 修复PDF转图片函数的缩进与路径逻辑
def convert_from_folder_to_images(input_pdfs_path, output_path): import os from glob import glob from pdf2image import convert_from_path # 简化输出路径判断 output_path = output_path if output_path is not None else input_pdfs_path # 自动创建输出目录避免报错 os.makedirs(output_path, exist_ok=True) list_of_pdfs = glob(os.path.join(input_pdfs_path, "*.pdf")) for pdf_path in list_of_pdfs: # 用os.path.splitext更稳妥,避免文件名带多个点的情况 file_name = os.path.splitext(os.path.basename(pdf_path))[0] pages = convert_from_path(pdf_path, poppler_path=r"C:\Users\username\poppler-0.68.0\bin") # 把页面保存逻辑缩进放到PDF遍历循环内部 for j, page in enumerate(pages): save_path = os.path.join(output_path, f"{file_name}_{j}.jpg") page.save(save_path, "JPEG")
2. 修复灰度转换函数的兼容问题
改用PIL读取图片兼容所有JPG编码和色彩模式,避免cv2.imread的兼容性问题:
def convert_to_grayscale(input_images_path, output_path): import os from glob import glob import cv2 import numpy as np from PIL import Image output_path = output_path if output_path is not None else input_images_path os.makedirs(output_path, exist_ok=True) list_of_images = glob(os.path.join(input_images_path, "*.jpg")) for i, img_path in enumerate(list_of_images): file_name = os.path.splitext(os.path.basename(img_path))[0] # 用PIL读取,兼容CMYK、渐进式JPG等特殊格式 pil_img = Image.open(img_path).convert("RGB") # 转换为OpenCV兼容的BGR格式 image = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) save_path = os.path.join(output_path, f"{file_name}_{i}_gray.jpg") cv2.imwrite(save_path, gray)
3. 可选:增加异常校验避免程序中断
如果需要跳过可能存在的异常文件,可以在读取后增加判断逻辑:
image = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) if image is None: print(f"文件{img_path}读取失败,已跳过") continue gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
内容的提问来源于stack exchange,提问作者brdptr02
相关产品推荐
相关产品推荐

