OpenCV无法读取文件报错:人脸检测算法运行异常求助
人脸检测算法文件夹输入处理问题解决
问题场景
开发人脸检测算法时,计划以文件夹中的图片作为输入,但运行代码时出现错误。
原实现代码
import dlib import argparse import cv2 import sys import time import process_dlib_boxes # construct the argument parser parser = argparse.ArgumentParser() parser.add_argument('-i', '--input', default=r"C:\Users\awais\OneDrive\Documents\Greenwich Uni work\Face detec work\images folder", help='path to the input image') parser.add_argument('-u', '--upsample', type=float, help='factor by which to upsample the image, default None, ' + 'pass 1, 2, 3, ...') args = vars(parser.parse_args()) # read the image and convert to RGB color format image = cv2.imread(args['input']) image_cvt = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # path for saving the result image save_name = f"outputs/{args['input'].split('/')[-1].split('.')[0]}_u{args['upsample']}.jpg" # initilaize the Dlib face detector according to the upsampling value detector = dlib.get_frontal_face_detector()
运行错误信息
[ WARN:0@0.138] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('C:\Users\awais\OneDrive\Documents\Greenwich Uni work\Face detec work\images folder'): can't open/read file: check file path/integrity Traceback (most recent call last): File "C:\Users\awais\OneDrive\Documents\Greenwich Uni work\Face detec work\face_det_image.py", line 20, in <module> image_cvt = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
问题根源:将文件夹路径直接传入cv2.imread(),该函数仅支持读取单张图片文件,无法解析文件夹结构,导致读取失败返回空图像,进而触发cv2.cvtColor()的断言错误。
解决方案
核心修改点
- 新增文件夹遍历逻辑,自动处理文件夹下的所有图片文件
- 兼容单图片文件和文件夹两种输入模式
- 修复路径处理的跨平台兼容性问题
- 添加图像读取有效性检查,避免程序崩溃
修改后的完整代码
import dlib import argparse import cv2 import sys import time import os from glob import glob import process_dlib_boxes # 自动创建输出目录(不存在则新建) os.makedirs('outputs', exist_ok=True) # 构造命令行参数解析器 parser = argparse.ArgumentParser() parser.add_argument('-i', '--input', default=r"C:\Users\awais\OneDrive\Documents\Greenwich Uni work\Face detec work\images folder", help='path to the input image OR folder containing images') parser.add_argument('-u', '--upsample', type=int, default=1, help='factor by which to upsample the image, default 1, pass 1, 2, 3, ...') args = vars(parser.parse_args()) # 初始化Dlib人脸检测器 detector = dlib.get_frontal_face_detector() # 获取所有待处理的图片路径 def get_image_paths(input_path): # 支持的图片格式列表 img_extensions = ('*.jpg', '*.jpeg', '*.png', '*.bmp') image_paths = [] if os.path.isdir(input_path): # 遍历文件夹下所有符合格式的图片 for ext in img_extensions: image_paths.extend(glob(os.path.join(input_path, ext))) elif os.path.isfile(input_path): # 直接添加单张图片路径 image_paths.append(input_path) else: print(f"Error: Invalid input path - {input_path}") sys.exit(1) return image_paths # 批量处理每张图片 for img_path in get_image_paths(args['input']): # 读取图片 image = cv2.imread(img_path) if image is None: print(f"Warning: Failed to read image {img_path}, skipping...") continue # 转换颜色空间为RGB image_cvt = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 执行人脸检测 start_time = time.time() dets = detector(image_cvt, args['upsample']) end_time = time.time() print(f"Processed {os.path.basename(img_path)}: {len(dets)} faces detected in {end_time - start_time:.3f}s") # 生成结果保存路径 img_name = os.path.splitext(os.path.basename(img_path))[0] save_name = f"outputs/{img_name}_u{args['upsample']}.jpg" # 绘制人脸检测框(示例逻辑,可根据process_dlib_boxes模块调整) for rect in dets: x1, y1 = rect.left(), rect.top() x2, y2 = rect.right(), rect.bottom() cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) # 保存结果图片 cv2.imwrite(save_name, image) print(f"Result saved to {save_name}")
关键说明
- 文件夹遍历:通过
glob和os模块自动扫描文件夹下所有支持格式的图片,实现批量处理 - 路径兼容性:使用
os.path系列函数替代字符串分割,适配Windows和Linux不同路径格式 - 错误防护:添加图片读取有效性检查,跳过损坏或无法读取的文件,避免程序异常终止
- 参数修正:将
upsample参数类型从float改为int,匹配Dlib检测器仅接受整数上采样因子的要求 - 自动目录创建:提前创建
outputs文件夹,避免保存结果时出现路径不存在的错误
内容的提问来源于stack exchange,提问作者Awais Ansari
相关产品推荐
相关产品推荐

