cv2.imread()循环读取后续图像失败,寻求技术解决方案
问题:cv2.imread仅能读取PDF转换后PNG目录中的第一张图像,其余返回None
我写了一段代码,先将多页PDF转换为单独的PNG图像并存储到同名子目录中,随后用OpenCV循环读取所有PNG文件。但cv2.imread()仅能读取循环中的第一张图像,其余迭代均返回None。例如目录中有4张转换完成的PNG,只有第一张能被正常读取,另外3次调用都返回None。我已在访达中确认所有PNG均正常生成并保存。
代码片段
file_name, num_pages, file_ext = convert_file(file_name=file_name) if not file_name: return {"error": "Incompatible file type. Allowed types are PNG, JPG/JPEG and PDF only."} images = [] for n in range(num_pages): try: if file_ext == 'pdf': page = cv2.imread(file_name + '/' + str(n) + '.png') shutil.rmtree(file_name, ignore_errors=True) else: page = cv2.imread(file_name) except cv2.error: logging.exception(f"Error reading image file {file_name + '/' + str(n) + '.png'}") pass if page is not None and len(page) > 0: images.append(page) if len(images) == 0: return {"error": "Failed reading document."}
补充说明
- 已确认PDF转换函数无问题,注释该函数后手动将图像存入目录,问题仍存在。尝试移除PDF首页,输入3页PDF,此时仅能读取原第二页(现在的第一页),其余2页仍读取失败。更换不同PDF文件测试,问题一致。
- 代码会创建与PDF同名的子目录,PNG页面存储其中,目录结构为:PDF文件同级存在同名文件夹,文件夹内是按页码命名的
0.png、1.png等文件。
问题分析与解决
问题根源
你在循环的第一次迭代中,读取完第一张PNG后立刻调用了shutil.rmtree(file_name),直接把存放所有PNG的目录彻底删除了!后续循环再去读取该目录下的文件,自然找不到对应的文件,导致cv2.imread返回None。
修复代码
将删除目录的操作移到循环结束后,确保所有PNG都读取完成再清理目录:
import os # 若使用os.path.join需要导入 file_name, num_pages, file_ext = convert_file(file_name=file_name) if not file_name: return {"error": "Incompatible file type. Allowed types are PNG, JPG/JPEG and PDF only."} images = [] try: for n in range(num_pages): if file_ext == 'pdf': # 用os.path.join拼接路径,适配不同系统的路径分隔符 img_path = os.path.join(file_name, f"{n}.png") page = cv2.imread(img_path) else: page = cv2.imread(file_name) if page is not None and len(page) > 0: images.append(page) finally: # 所有图片读取完成后再删除临时目录 if file_ext == 'pdf': shutil.rmtree(file_name, ignore_errors=True) if len(images) == 0: return {"error": "Failed reading document."}
额外建议
- 使用
os.path.join()拼接文件路径,避免因不同操作系统(Windows/macOS/Linux)的路径分隔符差异导致的路径错误,提升代码兼容性。 - 可以在读取前先判断文件是否存在,比如用
os.path.exists(img_path),提前排查路径问题。
内容的提问来源于stack exchange,提问作者wr93_
相关产品推荐
相关产品推荐

