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
英文地址,請注明出處:http://en.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…