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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:05:05