dlib检测视频中的人脸并裁剪为图片保存

环境要求

找个带有基本cv配置的虚拟环境安装上dlib依赖的人脸检测的基础环境即可,主要是:

pip install boost dlib opencv-python

缺的按提示安装。

demo

设置好视频路径和图像保存路径,裁剪尺寸(默认256)以及裁剪帧数(默认64),可以直接运行:

import os
import random
import cv2
import dlib
from imutils.face_utils import FaceAligner, rect_to_bb
from tqdm import tqdm  # 引入tqdm库# 配置路径
dataset_path = r'D:\python_project\face-parsing\dataset'  # 原始数据集路径
output_path = r'D:\python_project\face-parsing\dataset\results'  # 输出路径
crop_size = 256  # 人脸裁剪后的大小# 获取人脸对齐器
def get_face(fa, image):detector = dlib.get_frontal_face_detector()  # 获取人脸检测器gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 将图像转换为灰度图thresh = gray.shape[0] // 4  # 设置阈值rects = detector(gray, 2)  # 检测人脸face_aligned = None  # 初始化返回的人脸图像for rect in rects:(x, y, w, h) = rect_to_bb(rect)  # 获取人脸的坐标if w > thresh:  # 如果人脸宽度大于阈值,则认为是有效人脸face_aligned = fa.align(image, gray, rect)  # 对齐人脸break  # 只处理第一张人脸return face_aligned# 处理视频
def process_video(video_path, save_dir, fa):cap = cv2.VideoCapture(video_path)  # 打开视频文件total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取总帧数if total_frames < 64:  # 如果视频帧数少于64,跳过该视频print(f"Warning: Video '{video_path}' has less than 64 frames. Skipping.")cap.release()  # 释放视频文件returnstart_frame = random.randint(0, total_frames - 64)  # 随机选择起始帧frames = []for i in range(start_frame, start_frame + 64):  # 提取连续的64帧cap.set(cv2.CAP_PROP_POS_FRAMES, i)  # 设置当前读取的帧数ret, frame = cap.read()  # 读取该帧if ret:frames.append(frame)  # 保存读取到的帧cap.release()  # 释放视频文件for i, frame in enumerate(tqdm(frames, desc=f"Processing frames from {os.path.basename(video_path)}")):  # 加入进度条face_aligned = get_face(fa, frame)  # 对齐每一帧中的人脸if face_aligned is not None:img_name = f"{i + 1:05d}.jpg"  # 给每一帧命名save_path = os.path.join(save_dir, img_name)  # 保存路径cv2.imwrite(save_path, face_aligned)  # 保存图像else:print(f"Face not found in frame {i + 1}")  # 如果没有检测到人脸# 主函数:处理数据集中的所有视频
def align_dlib():predictor = dlib.shape_predictor(r"../weights/shape_predictor_68_face_landmarks.dat")  # 加载预测器fa = FaceAligner(predictor, desiredFaceWidth=crop_size)  # 初始化人脸对齐器# 遍历主目录(Training、Development、Testing)main_dirs = ['Testing']for main_dir in main_dirs:main_dir_path = os.path.join(dataset_path, main_dir)if not os.path.isdir(main_dir_path):print(f"Skipping non-directory: {main_dir_path}")continue# 遍历每个子目录(Northwind、Freeform 等)sub_dirs = os.listdir(main_dir_path)# for sub_dir in sub_dirs:#     sub_dir_path = os.path.join(main_dir_path, sub_dir)#     if not os.path.isdir(sub_dir_path):#         print(f"Skipping non-directory: {sub_dir_path}")#         continue# 遍历视频文件夹中的每个视频文件video_files = os.listdir(main_dir_path)for video_file in video_files:video_path = os.path.join(main_dir_path, video_file)if not os.path.isfile(video_path):continue# 获取视频名称(去掉文件扩展名)video_name = os.path.splitext(video_file)[0]# 构建保存路径: datasets/avec14/Training/Northwind/236_1_Northwind_videosave_path = os.path.join(output_path, main_dir, video_name)os.makedirs(save_path, exist_ok=True)  # 创建保存文件夹print(f"Processing video: {video_path}")process_video(video_path, save_path, fa)  # 处理该视频if __name__ == "__main__":align_dlib()  # 调用主函数进行处理

debug

eyesCenter在cv2.getRotationMatrix2D中一些版本要求是传入float型,直接传整型可能报错:

Traceback (most recent call last):
File “D:\python_project\face-parsing\utils\face_dect.py”, line 99, in
align_dlib() # 调用主函数进行处理
File “D:\python_project\face-parsing\utils\face_dect.py”, line 95, in align_dlib
process_video(video_path, save_path, fa) # 处理该视频
File “D:\python_project\face-parsing\utils\face_dect.py”, line 49, in process_video
face_aligned = get_face(fa, frame) # 对齐每一帧中的人脸
File “D:\python_project\face-parsing\utils\face_dect.py”, line 24, in get_face
face_aligned = fa.align(image, gray, rect) # 对齐人脸
File “C:\Users\Fine\anaconda3\envs\torch2\lib\site-packages\imutils\face_utils\facealigner.py”, line 68, in align
M = cv2.getRotationMatrix2D(eyesCenter, float(angle), float(scale))
TypeError: Can’t parse ‘center’. Sequence item with index 0 has a wrong type

将人脸对齐脚本中的eyesCenter类型转换为float即可:

		# eyesCenter = ((leftEyeCenter[0] + rightEyeCenter[0]) // 2,# 	(leftEyeCenter[1] + rightEyeCenter[1]) // 2)eyesCenter = ((leftEyeCenter[0] + rightEyeCenter[0]) / 2.0,(leftEyeCenter[1] + rightEyeCenter[1]) / 2.0)# grab the rotation matrix for rotating and scaling the faceM = cv2.getRotationMatrix2D(eyesCenter, float(angle), float(scale))

在这里插入图片描述
参考:
LinlyZhai-对AVEC2014视频进行Dlib或MTCNN人脸裁剪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86962.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真的!ToDesk远程控制已上线原生鸿蒙系统!

2025年5月&#xff0c;ToDesk远程控制正式宣布完成对PC鸿蒙系统的适配&#xff0c;成为业界首批原生支持HarmonyOS OS的跨端远控工具。 作为国内支持上亿设备的远程控制软件&#xff0c;ToDesk以无缝互联、快速响应、安全无界为核心&#xff0c;重新定义了跨设备远程协作的界限…

Java-58 深入浅出 分布式服务 ACID 三阶段提交3PC 对比2PC

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月16日更新到&#xff1a; AI炼丹日志-29 - 字节…

matplotlib 绘制饼图

1、功能介绍&#xff1a; 使用 python 的 matplotlib 库来创建一个简单的饼图。 2、代码部分&#xff1a; import matplotlib.pyplot as plt# 示例数据 labels [A, B, C, D, E] # 类别标签 sizes [15, 30, 45, 5, 5] # 每个类别对应的数值&#xff08;百分比&#xff09…

用Rust写平衡三进制除法器

1、除法的本质 除法的本质是减法&#xff0c;也就是一个大的数减去一个小的数&#xff0c;比如:10/2&#xff0c;也就是10-2-2-2-2-20&#xff0c;所以商5余0&#xff0c;10/3&#xff0c;也就是10-3-3-31&#xff0c;所以商3余1&#xff0c;这也是很常见的方法&#xff0c;但如…

深入探索WordPress Multisite:构建与管理多站点网络

随着互联网的快速发展&#xff0c;越来越多的企业和个人开始使用内容管理系统来搭建和维护自己的网站。WordPress作为全球最受欢迎的CMS之一&#xff0c;因其强大的功能和灵活性&#xff0c;成为了许多网站管理员的首选平台。而在一些特定需求的场景下&#xff0c;WordPress Mu…

.Net Core 获取文件路径

在 .NET Core 中获取文件路径的方法取决于你要获取的文件的位置和上下文。这里将介绍几种常见的方式来获取文件路径。 1. 获取当前工作目录 你可以使用 Directory.GetCurrentDirectory() 方法来获取当前工作目录的路径&#xff1a; using System; using System.IO; class P…

顺序表整理和单项链表01 day20

二&#xff1a;各个主要函数 一&#xff1a;CreatSeqList SeqList *CreateSeqList(int len); -------------------------------------------------------------/*** brief Create a Seq List object 创建一个顺序表** param n 是顺序表的大小* return SeqList* 指向顺序表的…

电商导购app平台的缓存策略与性能优化方案:架构师的实践经验

电商导购app平台的缓存策略与性能优化方案&#xff1a;架构师的实践经验 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 缓存策略的重要性 在电商导购APP平台中&#xff…

学习C++、QT---12(C++的继承、权限对继承的影响)

每日一言 你的价值&#xff0c;由你自己定义&#xff0c;无需他人评判。 C的继承 直接上案例 继承是什么意思呢&#xff0c;就是我本来这个类我叫他基类、我希望创建我的下一个类有我这之前的类的属性和方法&#xff0c;那么我如果不用继承的话&#xff0c;就需要多写很多一样…

(6)Wireshark的TCP包详解-上篇

1.简介 上一篇中通过介绍和讲解&#xff0c;应该知道要讲解和介绍的内容在哪里了吧&#xff0c;没错就是介绍OSI七层模型的传输层。因为只有它建立主机端到端的连接如&#xff1a;TCP、UDP。 2.TCP是什么? tcp是工作在传输层&#xff0c;也就是网络层上一层的协议。 它是面…

太极八卦罗盘JS绘制

LeaferJS 是一款好用的 Canvas 引擎,通过LeaferJS绘制罗盘案例. https://www.leaferjs.com/ui/guide/ 示例 太极八卦罗盘 直接上代码 <template><div id"LuoPan"></div><div id"info"><p>屏幕宽度: {{ screenWidth }}px<…

Python开源项目月排行 2025年5月

#2025年5月2025年6月1日1scrapy一个开源的、基于 Python 的高性能网络爬虫和数据抓取框架。Scrapy 项目最初由伦敦的网络聚合和电子商务公司 Mydeco 的员工以及乌拉圭蒙得维的亚的网络咨询公司 Insophia 的开发者共同创建。目前&#xff0c;Scrapy 由 Zyte&#xff08;原名 Scr…

Debezium日常分享系列之:在 Kubernetes 中使用 Debezium 的 CDC

Debezium日常分享系列之&#xff1a;在 Kubernetes 中使用 Debezium 的 CDC 架构源数据库创建数据库凭证密钥Debezium 自定义镜像构建并推送镜像Kafka Connect 集群Debezium Postgres 连接器Debezium 创建的 Kafka 主题 Debezium 是一个开源的分布式变更数据捕获 (CDC) 平台。D…

tf serving和torch serve哪个耗时更低

TensorFlow Serving&#xff08;TF Serving&#xff09;和 TorchServe 的耗时对比需结合具体场景&#xff08;如硬件配置、模型类型、优化策略等&#xff09;&#xff0c;以下从多维度分析两者的性能差异及适用场景。 ⏱️ 1. 标准性能基准对比 根据公开压测数据&#xff08;…

Java面试宝典:基础六

133. 二进制小数点位移 答案:C(乘以2) 解析: 原理:二进制小数点右移一位等价于乘以 (2^1)(左移则除以 (2))。示例: 101.1(5.5)右移 → 1011(11)验证:(5.5 \times 2 = 11)说明:位移前:1 0 1 . 1 (值 = 2+2⁰+2⁻ = 5.5) 位移后:1 0 1 1 . (值 = 2+2+2⁰ =…

04-React中绑定this并给函数传参的几种方式

前言绑定 this 的方式一&#xff1a;bind()绑定 this 并给函数传参 的方式二&#xff1a;构造函数里设置 bind()绑定 this 并给函数传参 的方式三&#xff1a;箭头函数【荐】 前言 我们先来看下面这段代码&#xff1a; components/MyComponent.jsx import React from "…

Docker拉取不兼容的镜像解决办法

错误提示如下&#xff1a; WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested295ef35cfefe0dce6904e017e89218695d9a9c092b45496218f4476357be4f9c 这个警告表明你…

android14 未充电状态电量低于15%弹框提示 10%直接关机

上层接收电量变化广播&#xff0c;添加未充电判断&#xff0c;做出弹框或关机动作 SystemUI\src\com\android\systemui\power\PowerUI.java Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (PowerManager.ACTION_POWE…

ASP.NET Core 中 Kestrel 的应用及在前后端分离项目中的角色

目录 一、Kestrel 基础&#xff1a;轻量级且高性能的 Web 服务器 二、前后端分离项目架构&#xff1a;Vue、.NET Core API、Nginx 与 Kestrel 2.1 交互流程图 2.2 流程详解 三、Kestrel 在架构中的核心作用 四、launchSettings.json 与 Kestrel 配置的关系及底层机制 4.1…

Kotlin 退出循环总结

文章目录 Kotlin 退出循环总结for循环forEach()嵌套for循环lambda函数inline函数 Kotlin 退出循环总结 for循环 for ((index, value) in list.withIndex()) {if (value "c") {break // 退出循环}println("$index - $value") }// 0 - a // 1 - bfo…