OpenCV的cv2.imwrite()在循环中无法向文件夹保存图片问题求助
问题原因
你使用str(datetime.now())生成的文件名包含冒号:字符,Windows、macOS、Linux等所有主流操作系统均不允许文件名中出现:、/、\、*、?、<、>、|、"这类特殊字符,因此图片写入失败。
另外你代码中定义的保存路径变量saveResults = 'ImageResult'和你列的项目目录中文件夹名imageResult大小写不一致,Linux/macOS系统对路径大小写敏感,也会触发路径不存在的报错。
修复方案
- 先统一路径大小写,确保代码中的路径和实际文件夹名完全一致,建议在代码初始化阶段就自动创建目标文件夹,避免手动创建遗漏的问题:
# 放在导包之后,读取数据集之前的位置 path = 'ImagesAttendance' saveResults = 'ImageResult' # 自动创建保存目录,不存在就新建,存在也不会报错 if not os.path.exists(saveResults): os.makedirs(saveResults)
- 修改
markAttendance函数中的文件名生成逻辑,用strftime格式化时间,去掉所有特殊字符,还可以加入人名、微秒后缀避免一秒内多次识别时的文件名冲突:
def markAttendance(name, img): with open('Attendance.csv','r+') as f: myDataList = f.readlines() nameList = [] for line in myDataList: entry = line.split(',') nameList.append(entry[0]) now = datetime.now() dtString = now.strftime('%H:%M:%S') f.writelines(f'\n{name},{dtString}') # 生成合法文件名:年月日_时分秒_微秒_人名.jpg file_name = now.strftime('%Y%m%d_%H%M%S_%f') + f'_{name}.jpg' # 用os.path.join拼接路径,避免不同操作系统的路径分隔符兼容问题 save_path = os.path.join(saveResults, file_name) cv2.imwrite(save_path, img)
修改后即可正常保存所有人脸截图到目标目录。
内容的提问来源于stack exchange,提问作者iamaksingh11
相关产品推荐
相关产品推荐

