You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

关键说明

  1. 文件夹遍历:通过glob和os模块自动扫描文件夹下所有支持格式的图片,实现批量处理
  2. 路径兼容性:使用os.path系列函数替代字符串分割,适配Windows和Linux不同路径格式
  3. 错误防护:添加图片读取有效性检查,跳过损坏或无法读取的文件,避免程序异常终止
  4. 参数修正:将upsample参数类型从float改为int,匹配Dlib检测器仅接受整数上采样因子的要求
  5. 自动目录创建:提前创建outputs文件夹,避免保存结果时出现路径不存在的错误

内容的提问来源于stack exchange,提问作者Awais Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:20:35