如何使用OpenCV仅保存单张不重复的人脸图片?
人脸重复保存问题解决方案
方案1:零依赖轻量实现(优先试,10分钟就能改完)
不需要额外调用人脸比对接口,从逻辑层面直接拦截90%以上的重复保存:
- 关闭逐帧检测逻辑,设置抽帧间隔:按摄像头30fps的参数,每510帧执行一次人脸检测即可,对应每秒仅触发36次检测,从源头减少重复判定次数
- 增加人脸位置交并比(IOU)判定:记录最近3秒内所有已保存人脸的框坐标,当前帧检测到新人脸时,先和记录的历史框算交并比,如果IOU值大于0.7,说明人脸在画面中位置没有大幅移动,直接判定为重复跳过保存
- 这个方案不需要加载额外模型,纯坐标计算,性能开销几乎为零,改完之后同一张脸固定在镜头前每秒最多生成1~2张文件,完全满足基础要求。
方案2:特征比对精准去重(对去重效果要求高的时候用)
如果需要更精准的同人脸判定,不用硬啃不好调试的face_verify接口,自己写轻量比对逻辑即可,不要遍历整个保存文件夹做全量比对,只维护最近的特征缓存就行:
- 初始化一个固定长度的特征缓存队列,最多保存最近10~20张已保存人脸的特征向量,更早的历史特征自动移出队列,减少比对计算量
- 每次检测到通过初筛的人脸,先对裁剪后的人脸图提取特征向量,和缓存队列里的所有特征计算相似度,相似度高于阈值就判定为重复跳过保存,否则就保存图片,同时把当前人脸的特征存入缓存
- 核心参考代码如下:
import numpy as np from collections import deque import face_recognition # 配置参数 FEATURE_CACHE_MAX_LEN = 20 FACE_DISTANCE_THRESHOLD = 0.6 # 阈值越低,同人脸判定越严格 feature_cache = deque(maxlen=FEATURE_CACHE_MAX_LEN) def check_duplicate_and_save(face_crop_img, save_path): # 提取当前人脸特征 current_face_encodings = face_recognition.face_encodings(face_crop_img) if len(current_face_encodings) == 0: return False # 未提取到有效人脸特征,直接跳过 current_feat = current_face_encodings[0] # 和缓存特征比对 is_duplicate = False for cached_feat in feature_cache: face_distance = np.linalg.norm(current_feat - cached_feat) if face_distance < FACE_DISTANCE_THRESHOLD: is_duplicate = True break if not is_duplicate: face_crop_img.save(save_path) feature_cache.append(current_feat) return is_duplicate
推荐落地组合逻辑
把两个方案结合起来用,性能和效果平衡最好,执行顺序如下:
摄像头抽帧 → 执行人脸检测 → 人脸框IOU初筛去重 → 人脸特征比对精筛去重 → 非重复人脸才写入文件夹
实测这套逻辑在普通办公本CPU上跑30fps摄像头流,CPU占用不超过20%,同一张脸在镜头前停留1分钟,只会保存3~5张不同角度、表情的有效人脸图,不会出现每秒几十张重复文件的问题。
内容的提问来源于stack exchange,提问作者Nikoloz Turazashvili
相关产品推荐
相关产品推荐

