Windows 上 opencv-python 4.10,图片放在「合同扫描件」目录下,cv2.imread 返回 None,路径换成英文就正常,脚本编码不是 UTF-8。
一开始怀疑是「路径里的空格没有处理」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。imread 走 C 字符串路径,Windows 下不认非 ASCII。少数情况下是脚本文件编码是 GBK,字符串本身就是乱码。
还有一种情况,图片文件实际是 0 字节。
动手时先确认文件存在且非空
python -c "import os;print(os.path.getsize('合同扫描件/a.jpg'))"
接着用字节流读入再解码
python -c "import cv2,numpy as np;buf=np.fromfile('合同扫描件/a.jpg',dtype=np.uint8);print(cv2.imdecode(buf,cv2.IMREAD_COLOR).shape)"
然后打印当前文件系统编码
python -c "import sys;print(sys.getfilesystemencoding())"
转成 utf-8 后重跑脚本
python -X utf8 ocr_batch.py --dir '合同扫描件'
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
别只看报错消失,验证要多做一步。中文路径下也能读到图像,返回的 shape 与图片实际尺寸一致,后续检测不受影响。
OpenCV 的路径问题不在图像本身,用 numpy 读字节再 imdecode 是最稳的绕法。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
