# 基于人臉關鍵點的多表情實時檢測系統

基于人臉關鍵點的多表情實時檢測系統

在計算機視覺領域,人臉表情識別技術已經取得了顯著的進展。它不僅可以用于娛樂應用(如動態表情包生成),還能在心理健康監測、智能安防、人機交互等領域發揮重要作用。今天,我將分享一個基于人臉關鍵點的多表情實時檢測系統,該系統能夠通過攝像頭實時識別微笑、大笑、哭泣和憤怒等多種表情。

1. 項目背景與動機

人臉表情是人類情感的重要外在表現形式。通過分析人臉的表情,我們可以更好地理解他人的情緒狀態。傳統的表情識別方法主要依賴于深度學習模型,這些模型雖然精度高,但計算復雜度較高,難以在資源受限的設備上實現實時檢測。相比之下,基于人臉關鍵點的方法更加輕量級,通過分析關鍵點的位置關系來推斷表情狀態,適合在實時系統中應用。

本項目的目標是開發一個實時系統,能夠通過攝像頭捕捉人臉圖像,并根據人臉關鍵點的位置關系判斷當前的表情狀態。我們將重點實現微笑、大笑、哭泣和憤怒這四種常見表情的檢測。

2. 技術棧與工具

為了實現這個項目,我們使用了以下技術和工具:

  • Python:作為主要的開發語言,Python 提供了豐富的庫支持,便于快速開發和調試。
  • OpenCV:用于圖像處理和視頻流操作,能夠高效地讀取攝像頭數據并進行圖像繪制。
  • dlib:提供了強大的人臉檢測和關鍵點定位功能,是實現人臉關鍵點提取的核心工具。
  • scikit-learn:用于計算歐幾里得距離,幫助我們分析關鍵點之間的空間關系。
  • Pillow:用于在圖像上繪制中文文本,方便在實時視頻中顯示識別結果。

3. 關鍵技術實現

3.1 人臉檢測與關鍵點提取

人臉檢測是表情識別的第一步。我們使用 dlib 提供的 get_frontal_face_detector 方法來檢測圖像中的人臉區域。一旦檢測到人臉,我們再利用 shape_predictor 模型提取人臉的 68 個關鍵點。這些關鍵點包括眼睛、眉毛、鼻子、嘴巴等部位的特征點,為后續的表情分析提供了基礎數據。

detector = dlib.get_frontal_face_detector()  # 構造臉部位置檢測器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")  # 讀取人臉關鍵點定位模型
faces = detector(frame, 0)  # 獲取人臉
for face in faces:  # 循環遍歷每一個人臉shape = predictor(frame, face)  # 獲取關鍵點shape = np.array([[p.x, p.y] for p in shape.parts()])  # 將關鍵點轉換為坐標(x,y)的形式

3.2 表情特征計算

為了判斷不同表情,我們定義了多個特征指標,包括嘴寬比(MWR)、嘴高比(MHR)和眼睛寬高比(EAR)等。

  • 嘴高比(MHR):計算嘴巴的平均高度與嘴巴寬度的比值。嘴巴的高度通過關鍵點 50、51、52 與 58、57、56 的距離計算,嘴巴寬度通過關鍵點 48 和 54 的距離計算。當 MHR 超過一定閾值時,可能表示大笑。
  • 嘴寬比(MWR):計算嘴巴寬度與下頜寬度的比值。嘴巴寬度通過關鍵點 48 和 54 的距離計算,下頜寬度通過關鍵點 3 和 13 的距離計算。當 MWR 超過一定閾值時,可能表示微笑。
  • 眼睛寬高比(EAR):計算眼睛的寬高比,用于檢測眼睛閉合程度。當 EAR 小于一定閾值時,可能表示眼睛閉合,進而推斷出哭泣等表情。
def MAR(shape):A = euclidean_distances(shape[50].reshape(1, 2), shape[58].reshape(1, 2))B = euclidean_distances(shape[51].reshape(1, 2), shape[57].reshape(1, 2))C = euclidean_distances(shape[52].reshape(1, 2), shape[56].reshape(1, 2))D = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))return ((A + B + C) / 3) / Ddef MJR(shape):M = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))  # 嘴寬度J = euclidean_distances(shape[3].reshape(1, 2), shape[13].reshape(1, 2))  # 下頜寬度return M / Jdef EAR(shape):A = euclidean_distances(shape[37].reshape(1, 2), shape[41].reshape(1, 2))B = euclidean_distances(shape[38].reshape(1, 2), shape[40].reshape(1, 2))C = euclidean_distances(shape[36].reshape(1, 2), shape[39].reshape(1, 2))return (A + B) / (2.0 * C)

3.3 實時視頻流處理

我們通過 OpenCV 的 VideoCapture 方法獲取攝像頭的實時視頻流,并在每一幀圖像上進行人臉檢測和表情識別。識別結果會以中文文本的形式顯示在視頻窗口中,同時繪制嘴巴的凸包輪廓,以便直觀地觀察嘴巴的形狀變化。

cap = cv2.VideoCapture(0)
while True:ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = detector(gray, 0)for face in faces:shape = predictor(gray, face)shape = np.array([[p.x, p.y] for p in shape.parts()])mar = MAR(shape)mjr = MJR(shape)ear = EAR(shape)result = "正常"if mar > 0.5:result = "大笑"elif mjr > 0.45:result = "微笑"elif ear < 0.2:  # 眼睛閉合,可能是在哭result = "哭"elif euclidean_distances(shape[19].reshape(1, 2), shape[24].reshape(1, 2)) < 20:  # 眉毛距離變小,可能是在憤怒result = "憤怒"print("MAR:", mar, "\tMJR:", mjr, "\tEAR:", ear, "\t表情:", result)mouthHull = cv2.convexHull(shape[48:61])frame = cv2AddChineseText(frame, result, (mouthHull[0, 0][0], mouthHull[0, 0][1] - 20))cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)cv2.imshow("Frame", frame)if cv2.waitKey(1) == 27:  # 按ESC退出breakcv2.destroyAllWindows()
cap.release()

5. 總結

通過本項目,我們成功實現了一個基于人臉關鍵點的多表情實時檢測系統。這個項目不僅展示了人臉關鍵點在表情識別中的應用,還為后續的擴展和優化提供了基礎。希望這個項目能夠為對人臉表情識別感興趣的朋友提供一些參考和啟發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900398.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900398.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重構二開的開源項目 Dify-Plus

一、安裝環境信息說明 硬件資源&#xff08;GB 和 GiB 的主要區別在于它們的換算基數不同&#xff0c;GB 使用十進制&#xff0c;GiB 使用二進制&#xff0c;導致相同數值下 GiB 表示的容量略大于 GB&#xff1b;換算關系&#xff1a;1 GiB ≈ 1.07374 GB &#xff1b;1 GB ≈ …

SQL Server存儲過程和觸發器的使用

存儲過程 &#xff08;1&#xff09;創建存儲過程&#xff0c;使用Employees表中的員工人數來初始化一個局部變量&#xff0c;并調用這個存儲過程。 1. Create PROCEDURE test number1 int output --輸出參數&#xff0c;可以從程序中返回信息 2. As 3. begin 4. D…

子類是否能繼承

繼承 父類&#xff1a; 子 類 構造方法 非私有 不能繼承 私有&#xff08;private&#xff09;不能繼承 成員變量 非私有 能繼承 私有&…

2025年【山東省安全員C證】考試題及山東省安全員C證考試內容

在當今建筑行業蓬勃發展的背景下&#xff0c;安全生產已成為企業生存與發展的基石。安全員作為施工現場安全管理的直接責任人&#xff0c;其專業能力和資質認證顯得尤為重要。山東省安全員C證作為衡量安全員專業水平的重要標準&#xff0c;不僅關乎個人職業發展&#xff0c;更直…

Spring 中的 bean 生命周期

&#x1f331; 一、什么是 Bean 生命周期&#xff1f; 在 Spring 容器中&#xff0c;一個 Bean 從“創建 → 初始化 → 使用 → 銷毀”&#xff0c;經歷了完整的生命周期。 Spring 提供了 多個擴展點 讓你可以在這些階段做事情&#xff0c;比如注入資源、日志記錄、連接資源、清…

Media streaming mental map

Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…

AIDD-深度學習 MetDeeCINE 破譯代謝調控機制

深度學習 MetDeeCINE 破譯代謝調控機制 目錄 使用 FEP/REMD 和 DFT 方法準確預測藥物多靶點絕對結合自由能的新途徑。Scorpio 框架利用對比學習優化核苷酸序列表示&#xff0c;提升基因組分析效率&#xff0c;尤其在未知序列的分類和泛化能力上表現出色。LPM 模型整合多模態擾…

【2】搭建k8s集群系列(二進制)之安裝etcd數據庫集群

一、etcd服務架構 Etcd 是一個分布式鍵值存儲系統&#xff0c;Kubernetes 使用 Etcd 進行數據存儲&#xff0c;所以先 準備一個 Etcd 數據庫&#xff0c;為解決 Etcd 單點故障&#xff0c;應采用集群方式部署&#xff0c;這里使用 3 臺組建集群&#xff0c;可容忍 1 臺機器故障…

fastGPT—前端開發獲取api密鑰調用機器人對話接口(HTML實現)

官網文檔鏈接&#xff1a;OpenAPI 介紹 | FastGPT 首先按照文檔說明創建api密鑰 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

cpp自學 day19(多態)

一、基本概念 同一操作作用于不同的對象&#xff0c;產生不同的執行結果 &#x1f449; 就像「按F1鍵」&#xff1a;在Word彈出幫助文檔&#xff0c;在PS彈出畫筆設置&#xff0c;?同一個按鍵觸發不同功能 &#xff08;1&#xff09;多態類型 類型實現方式綁定時機?靜態多態…

Java 大視界 -- Java 大數據在航天遙測數據分析中的技術突破與應用(177)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

人臉考勤管理一體化系統(人臉識別系統,簽到打卡)

人臉考勤管理一體化系統 項目介紹 本項目是基于Flask、SQLAlchemy、face_recognition庫的人臉考勤管理一體化系統。 系統通過人臉識別技術實現員工考勤打卡、人臉信息采集、人臉模型訓練等功能。 項目采用前后端分離的技術框架&#xff0c;基于Flask輕量級Web框架搭建后端服務…

單調棧學習C++

目錄 一&#xff0c;每日溫度 二&#xff0c;下一個更大的元素I 三&#xff0c;下一個更大的元素II 四&#xff0c;接雨水 小結&#xff1a; 單調棧是一種特殊的棧結構&#xff0c;里面的元素按照單調遞增或者遞減的順序排列。常用于解決元素左邊或者右邊比它大或者小的問…

網絡釣魚攻擊的威脅和執法部門的作用(第一部分)

在當今的數字世界中&#xff0c;網絡犯罪分子不斷開發新技術來利用個人、企業和政府機構。 最普遍和最具破壞性的網絡犯罪形式之一是網絡釣魚——一種社會工程手段&#xff0c;用于欺騙人們提供敏感信息&#xff0c;例如登錄憑據、財務數據和個人詳細信息。 隨著網絡釣魚攻擊…

左值與右值,空間與數據

左值是空間&#xff0c;右值是數據 編程總是對“數據”&#xff0c;對"存放數據的空間"操作 a返回一個當前的數據&#xff0c;存放到一個臨時空間中&#xff0c;自身的空間中的數據再進行運算 a直接對自身空間中的數據進行運算 其余知識&#xff1a; 1.變量名的意…

無人機飛行術語科普!

一、基礎操作類 1. 炸機 指無人機意外墜毀或嚴重損壞&#xff08;如撞樹、撞樓、失控摔機等&#xff09;。 例句&#xff1a;“今天風太大&#xff0c;差點炸機&#xff01;” 2. 一鍵放生 調侃某些情況下無人機失控飛丟&#xff0c;無法找回&#xff08;源自某些品牌…

模擬算法(一):一維數組模擬

目錄 模擬的概念 例1&#xff1a;開關燈 算法思路&#xff1a; 代碼如下&#xff1a; 輸入輸出&#xff1a; 例2&#xff1a;序列操作和查詢 算法思路&#xff1a; 代碼如下&#xff1a; 輸入輸出&#xff1a; 例3&#xff1a;數組折疊 算法思路&#xff1a; 代碼如…

MySQL 基礎入門

寫在前面 關于MySQL的下載安裝和其圖形化軟件Navicat的下載安裝,網上已經有了很多的教程,這里就不再贅述了,本文主要是介紹了關于MySQL數據庫的基礎知識。 MySQL數據庫 MySQL數據庫基礎 MySQL數據庫概念 MySQL 數據庫&#xff1a; 是一個關系型數據庫管理系統 。 支持SQL語…

Qt中的多種輸出方式,信號與槽的基本使用

完成Hello World可以通過很多控件實現 如采用編輯框來完成hello world 編輯框分為單行編輯框----QLineEdit 和多行編輯框---QTextEdit 采用單行編輯框&#xff0c;創建項目后&#xff0c;展開forms文件夾&#xff0c;雙擊ui文件進入 qt designer設計頁面 找到line edit 拖到頁…

英語表達年代和世紀

英語表達年代和世紀 1. Century (世紀)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英語表達年代和世紀4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的連續 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年這連續 10 年。 XX 世紀 X0 年代…