如何使用cv2.imwrite()拍摄照片?检测人脸时该函数无法生成100张照片
解决cv2.imwrite()不工作及捕获100张人脸照片的问题
原代码存在的问题
- 颜色转换错误:OpenCV通过
cap.read()获取的帧是BGR格式,你用cv2.COLOR_RGB2BGR转换得到的不是灰度图,应该用cv2.COLOR_BGR2GRAY生成正确的灰度图,否则人脸检测会失效,后续保存逻辑也不会触发。 - 文件名重复覆盖:生成的文件名
{time_stamp}-face.jpg没有区分100张照片,循环100次会不断覆盖同一个文件,最后只保留1张。需要把循环索引加入文件名,确保每张照片唯一。 - 逻辑错误:重复保存同一帧:当前代码在检测到人脸的单帧里循环100次保存同一帧,这不是“拍摄100张照片”,而是重复保存同一张。应该改为连续捕获100帧并分别保存。
- 时间戳格式问题:
%D已经包含月/日/年,再加上-%m-%Y会导致格式冗余,且%D里的斜杠在部分操作系统中是非法的文件名字符,建议改用无特殊字符的时间格式。 - 未释放资源:代码结束后没有释放摄像头资源和销毁窗口,容易导致后续摄像头无法正常使用。
修复后的代码
import cv2 import datetime cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # 标记是否正在捕获100张照片 capturing = False capture_count = 0 while True: ret, frame = cap.read() if not ret: break # 读取帧失败时退出 # 正确转换为灰度图用于人脸检测 greyImg = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(greyImg, 1.3, 5) for x, y, w, h in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 5) # 检测到人脸且未在捕获状态时,启动100张捕获流程 if not capturing: capturing = True capture_count = 0 # 处于捕获状态时,逐帧保存 if capturing: # 使用无特殊字符的时间戳+计数作为文件名,避免覆盖 time_stamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") file_name = f"{time_stamp}-face-{capture_count}.jpg" # 保存彩色帧(如需灰度帧可替换为greyImg) cv2.imwrite(file_name, frame) capture_count += 1 # 捕获满100张后停止 if capture_count >= 100: capturing = False print("已完成100张人脸照片捕获") cv2.imshow("Face recognition", cv2.flip(frame, 1)) if cv2.waitKey(1) == ord("q"): break # 释放摄像头资源并销毁窗口 cap.release() cv2.destroyAllWindows()
修复说明
- 新增
capturing和capture_count变量,控制捕获状态和计数,确保检测到人脸后连续捕获100张不同的帧。 - 修正灰度图转换方式,保证人脸检测逻辑正常触发。
- 文件名加入时间戳和计数索引,既避免文件覆盖,又保证文件名在所有操作系统中合法。
- 增加帧读取失败的判断,提升代码鲁棒性。
- 代码结束时释放摄像头资源并销毁窗口,避免占用系统资源。
内容的提问来源于stack exchange,提问作者Ritesh
相关产品推荐
相关产品推荐

