一个使用Go语言实现的高效视频人脸检测和截取工具,支持并发处理,能快速从视频中检测并保存人脸图像,并为人脸质量打分。
- 🔍 读取视频文件并逐帧检测人脸
- 📸 自动截取检测到的人脸并保存为图片
- ⭐ 为人脸质量打分(基于大小和清晰度)
- ⚡ 多协程并发处理,提高解析速率
- 🎯 支持命令行参数配置,灵活使用
- Go 1.18+(推荐使用最新版本)
- OpenCV 4.x
重要提示:安装OpenCV和配置GoCV环境可能比较复杂。请参考本项目中的INSTALL.md文件,获取详细的Windows平台安装指南。
- 首先安装Go语言环境
- 按照INSTALL.md中的步骤安装OpenCV和配置GoCV
- 安装GoCV包:
go get -u gocv.io/x/gocv
- 下载人脸检测模型: haarcascade_frontalface_default.xml
# 基本使用(使用默认参数)
go run main.go
# 自定义参数使用
go run main.go -video your_video.mp4 -model haarcascade_frontalface_default.xml -output detected_faces -workers 8 -skip 1-video: 输入视频文件路径(默认为 "input_video.mp4")-model: 人脸检测模型路径(默认为 "haarcascade_frontalface_default.xml")-output: 人脸图像输出目录(默认为 "detected_faces")-workers: 并发工作协程数量(默认为 4)-skip: 跳帧数量(用于加快处理速度,默认为 0,即不跳帧)
输出的人脸图像文件命名格式为:
face_worker{workerID}_frame{frameNum}_{timestamp}_quality{score}.jpg
workerID: 处理该帧的工作协程IDframeNum: 人脸所在的视频帧号timestamp: 时间戳(确保唯一性)score: 人脸质量评分(0-100分)
评分基于以下两个因素:
- 人脸大小(占30%权重):适中的人脸大小(50-200像素)得分更高
- 清晰度(占70%权重):基于拉普拉斯算子计算的图像清晰度
- 对于长视频,可以使用
-skip参数跳帧处理,提高速度 - 根据CPU核心数调整
-workers参数,一般设置为CPU核心数的1-2倍 - 对于高清视频,可以考虑先降采样处理再进行人脸检测
-
编译错误:找不到opencv2/opencv.hpp
- 请参考INSTALL.md文件,确保正确设置了CGO环境变量
- 确保OpenCV已正确安装并配置
-
OpenCV 4.12.0 兼容性问题 如果您安装了OpenCV 4.12.0版本并在编译时遇到protobuf相关错误(如"error: temporary of non-literal type 'google::protobuf::internal::CallOnceInitializedMutexstd::mutex' in a constant expression"),请尝试以下解决方案:
- 更新GoCV版本:
go get -u gocv.io/x/gocv
- 降级到更稳定的OpenCV版本(如4.5.x或4.6.x)
- 查看GoCV官方文档获取最新的兼容性信息
- 更新GoCV版本:
-
无法找到人脸
- 确保已下载并正确放置人脸检测模型文件
- 调整视频的亮度和对比度,有助于提高检测准确率
-
处理速度慢
- 增加
-skip参数值,减少处理的帧数 - 增加
-workers参数值,提高并发处理能力 - 对于高清视频,可以先进行降采样处理
- 增加
- 程序需要足够的内存来处理视频和图像数据
- 对于大型视频文件,处理时间可能较长
- 人脸检测的准确性取决于视频质量和人脸清晰度
MIT