循环处理图片时cv2.imwrite报!_img.empty()错误的解决求助
问题:Haar分类器提取嘴巴特征时循环报错
!_img.empty() 我用Haar分类器从批量图片中裁剪嘴巴区域时遇到异常:第一次迭代后,剩余40多张图片无法继续处理,持续抛出!_img.empty()错误。已确认图片读取正常、模块导入无问题,仅在人脸检测的内层循环中添加break时能运行一次,否则无法保存任何输出。
功能代码
def lip_extraction(): path = "./data/test_cut-opencv/" os.chdir(path) images = [cv2.imread(file) for file in glob.glob("*.png")] print(images) i=0 for image in images: # print(len(images)) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print(len(gray)) faces = face_casecade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: gray = gray[y:y+h, x:x+w] print(i) cv2.imwrite("img_1.png", gray) i+=1
抛出的错误信息
error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
问题根源分析
- 多次裁剪导致数组越界:如果单张图片检测到多张人脸,内层循环会重复对
gray进行裁剪——第一次裁剪后人脸区域成为新的gray,第二次用原始图片中另一张人脸的坐标去裁剪这个缩小后的区域,必然会超出索引范围,导致gray变成空数组。 - 未处理人脸检测失败的情况:若某张图片未检测到人脸,
faces为空列表,内层循环不执行,但后续代码直接使用原始gray?不,结合代码逻辑,若多次裁剪后gray为空,或者图片读取本身返回None(你当前的列表推导式没过滤无效图片),都会导致imwrite接收空对象。 - 输出文件名重复覆盖:每次循环都写入
img_1.png,不仅会覆盖之前的结果,若某次写入的gray为空,直接触发断言错误。
修复方案
修改后的代码示例
def lip_extraction(): path = "./data/test_cut-opencv/" os.chdir(path) # 过滤读取失败的图片(cv2.imread返回None表示读取失败) images = [] for file in glob.glob("*.png"): img = cv2.imread(file) if img is not None: images.append(img) else: print(f"读取失败:{file}") i = 0 for image in images: gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_casecade.detectMultiScale(gray, 1.3, 5) # 仅处理第一张检测到的人脸,避免多次裁剪越界 if faces: x, y, w, h = faces[0] face_gray = gray[y:y+h, x:x+w] # 补充:用嘴巴Haar分类器检测嘴巴区域(原需求遗漏此步骤) mouths = mouth_cascade.detectMultiScale(face_gray, 1.2, 4) if mouths: mx, my, mw, mh = mouths[0] lip_gray = face_gray[my:my+mh, mx:mx+mw] cv2.imwrite(f"img_lip_{i}.png", lip_gray) else: print(f"图片{i}未检测到嘴巴,保存人脸区域") cv2.imwrite(f"img_face_{i}.png", face_gray) else: print(f"图片{i}未检测到人脸,保存原始灰度图") cv2.imwrite(f"img_original_{i}.png", gray) i += 1
关键优化点
- 过滤无效图片:提前排除
cv2.imread返回None的损坏或异常图片 - 限制人脸处理数量:仅取第一张检测到的人脸,避免重复裁剪导致数组越界
- 处理检测失败分支:对未检测到人脸/嘴巴的情况做兜底处理,不直接抛出错误
- 生成唯一文件名:用
i拼接文件名,避免覆盖且方便追踪处理进度 - 补充嘴巴检测逻辑:原代码只裁剪了人脸区域,未实现嘴巴提取的核心需求,需加载嘴巴对应的Haar分类器
内容的提问来源于stack exchange,提问作者Haider Muhammad
相关产品推荐
相关产品推荐

