Opencv之dilib庫:表情識別

一、簡介

????????在計算機視覺領域,表情識別是一個既有趣又具有挑戰性的任務。它在人機交互、情感分析、安防監控等眾多領域都有著廣泛的應用前景。本文將詳細介紹如何使用 Python 中的 OpenCV 庫和 Dlib 庫來實現一個簡單的實時表情識別系統。

二、實現原理

? ? ? ?表情識別系統主要基于面部關鍵點的檢測與分析。Dlib 庫提供了強大的面部關鍵點檢測器,能夠準確地定位出面部的 68 個關鍵點,這些關鍵點涵蓋了眼睛、眉毛、鼻子、嘴巴等重要面部特征部位。通過計算這些關鍵點之間的距離比例,我們可以提取出能夠表征不同表情的特征指標。

三、具體代碼實現

import cv2
import numpy as np
import dlib
from sklearn.metrics.pairwise import euclidean_distances
from PIL import Image, ImageDraw, ImageFont

上述代碼導入了實現表情識別所需的各種庫。OpenCV 用于圖像處理和視頻捕獲;Numpy 用于數值計算;Dlib 用于面部檢測和關鍵點定位;scikit - learn 的?euclidean_distances?函數用于計算歐幾里得距離,以幫助我們計算面部關鍵點之間的距離;Pillow 庫則用于在圖像上添加中文文本。

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) / D

在MAR函數中,通過選取嘴巴周圍的關鍵點(如嘴角、嘴唇中部等),計算它們之間的歐幾里得距離,然后根據特定的公式計算出嘴巴長寬比。這個比值越大,通常表示嘴巴張開得越大,越有可能是大笑表情。

def 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/J

MJR函數則計算了嘴巴寬度與臉部寬度的比值。當這個比值超過一定閾值時,我們認為面部表情為微笑。這里通過比較嘴巴寬度和臉部特定寬度(兩眼外角之間的寬度近似代表臉部寬度),來捕捉微笑時嘴巴相對臉部的變化特征。

def cv2AddChineseText(img, text, position, textColor = (255, 0, 0), textSize =50):if (isinstance(img,np.ndarray)):img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")draw.text(position, text, textColor, font=fontStyle)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

函數首先將 OpenCV 的 BGR 圖像轉換為 RGB 格式,然后使用 Pillow 庫的?ImageDraw?和?ImageFont?在圖像上指定位置繪制中文文本,最后再將圖像轉換回 BGR 格式,以便后續在 OpenCV 中使用。下面是主程序部分

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
cap = cv2.VideoCapture(0)

這里使用 Dlib 的?get_frontal_face_detector?函數初始化面部檢測器,加載預訓練的 68 個面部關鍵點模型?shape_predictor_68_face_landmarks.dat?用于關鍵點預測,并通過?cv2.VideoCapture(0)?打開電腦默認攝像頭。

while True:ret,frame = cap.read()faces = detector(frame, 0)for face in faces:shape = predictor(frame, face)shape = np.array([[p.x, p.y] for p in shape.parts()])mar = MAR(shape)mjr = MJR(shape)result = "正常"print("mar",mar,"\tmjr",mjr)if mar > 0.5:result = "大笑"elif mjr > 0.45:result = "微笑"mouthHULL = cv2.convexHull(shape[48:61])frame = cv2AddChineseText(frame, result,mouthHULL[0,0])cv2.drawContours(frame, [mouthHULL], -1, (0, 255, 0), 1)cv2.imshow("Frame",frame)if cv2.waitKey(1) == 27:break
cv2.destroyAllWindows()
cap.release()

?

在循環中,每讀取一幀視頻圖像,首先使用面部檢測器檢測圖像中的所有面部。對于每個檢測到的面部,通過關鍵點預測器獲取面部關鍵點坐標,并將其轉換為 Numpy 數組形式以便后續計算。接著計算?MAR?和?MJR?值,并根據預設的閾值判斷表情類別,將識別結果存儲在?result?變量中。為了可視化效果,我們使用?cv2.convexHull?函數計算嘴巴區域的凸包,并使用?cv2.drawContours?函數將其繪制在圖像上。同時,調用?cv2AddChineseText?函數在嘴巴凸包的起始位置添加識別出的表情文本。最后,通過?cv2.imshow?函數顯示處理后的圖像。當用戶按下 Esc 鍵(鍵值為 27)時,循環結束,關閉所有窗口并釋放攝像頭資源。

運行結果

四、總結

通過上述步驟,我們成功構建了一個簡單的實時表情識別系統,能夠識別出大笑和微笑兩種表情。然而,當前系統還存在一些局限性。例如,僅通過兩個簡單的特征指標來判斷表情,可能無法準確識別更復雜多樣的表情,如憤怒、悲傷、驚訝等。并且,閾值的設定是基于經驗,可能在不同環境和個體上表現不穩定。

?

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

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

相關文章

【動態規劃】線性dp——LIS和LCS

參考文章 子序列 一個序列 A = a 1 , a 2 , … , a n A=a_1,a_2,…,a_n A=a1?,a2?,…,an? 中任意刪除若干項,剩余的序列叫做 A 的一個子序列。也可以認為是從序列 A 按原順序保留任意若干項得到的序列。(例如&…

umi框架開發移動端h5

1、官網:https://umijs.org/ 2、創建出來的項目 yarn create umi yarn start3、推薦目錄結構 . ├── config │ └── config.ts ├── public//靜態資源 ├── dist ├── mock │ └── app.ts|tsx ├── src │ ├── .umi │ ├── .um…

《Golang高性能網絡編程:構建低延遲服務器應用》

在本文中,我們將深入探討Golang高性能網絡編程,幫助您構建低延遲服務器應用。我們將介紹Golang的網絡編程特性、優化技巧和實際案例,讓您更好地理解和應用Golang在網絡編程領域的優勢。 高性能網絡編程簡介 什么是Golang高性能網絡編程 高性能…

循環結構- P1217-回文質數-第三十四天

洛谷題單 第三十四天:4.3(周四) 題目:循環結構–P1217 注意!!!本題的解法在初學階段足矣,使用埃氏篩即可全部AC(高級算法,優化時間復雜度)&…

github鏡像網站的使用

很多時候我們無法訪問github 那么我們可以網上搜索鏡像網站 比如 https://blog.csdn.net/eytha/article/details/144797222 這里可以找到一些鏡像站 然后直接編輯 c:/user/xxx/.gitconfig 內容如 [user]name xxxxemail xxxxhotmail.com [gui]recentrepo D:/ProjectFolder/t…

論定制開發開源 AI 智能名片 S2B2C 商城小程序源碼在零售變革中的角色與價值

摘要:本文深入探討了新零售中 O2O 模式的特點與局限性,指出其雖有導流作用但難以成為企業轉型適應消費大環境的主力做法。強調解決零售根本問題需依靠大零售概念,包括業態融合、情境創造、分解滲透等。同時引入定制開發開源 AI 智能名片 S2B2…

硬件工程師零基礎入門教程(三)

27.二極管的基本結構 二極管的結構就是一個PN節,導通后肯定會存在壓降(硅管≈0.7V;鍺管≈0.3V)。 其結構就像一個漏斗結構,普通二極管只能單向導通。 注意:二極管兩端不能直接接大于二極管導通壓降的電壓…

ollama導入huggingface下載的大模型并量化

1. 導入GGUF 類型的模型 1.1 先在huggingface 下載需要ollama部署的大模型 1.2 編寫modelfile 在ollama 里面輸入 ollama show --modelfile <你有的模型名稱> eg: ollama show --modelfile qwen2.5:latest修改其中的from 路徑為自己的模型下載路徑 FROM /Users/lzx/A…

C++基礎系列【35】巧用assert

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

【EI檢索】2025年城市設計與規劃國際會議 (CoUDP 2025)

重要信息 會議網址&#xff1a;www.coudp.org 會議時間&#xff1a;2025年9月19-21日 召開地點&#xff1a;中國北京 截稿時間&#xff1a;2025年8月19日 錄用通知&#xff1a;投稿后2周內 收錄檢索&#xff1a;Ei Compendex, SCOPUS 會議簡介 2025年城市設計與規劃…

《實戰AI智能體》MCP對Agent有哪些好處

首先MCP為Agent提供了標準化的方式來接入各種工具和數據源,無論是本地運行的工具,例如通過stdio服務器,還是遠程托管的服務HTTP over SSE服務, Agent都可以通過統一的接口與它們進行交互,極大擴展了第三方工具庫。 例如,在金融領域,Agent 可以接入股票分析的MCP工具。當…

知識圖譜在官網中的本質與部署邏輯

知識圖譜在官網中的本質與部署邏輯 ?1. 知識圖譜不是獨立頁面&#xff0c;而是智能化基礎設施 知識圖譜的最終形態并非一個可見的“圖譜頁面”&#xff0c;而是滲透在官網各交互模塊的AI能力引擎&#xff0c;其核心作用在于&#xff1a; ?后臺&#xff1a;構建實體關系網絡…

藍橋杯沖刺

例題1&#xff1a;握手問題 方法1&#xff1a;數學推理(簡單粗暴&#xff09; 方法2&#xff1a;用代碼實現方法1 #include<iostream> using namespace std; int main() {int result 0;for (int i 1; i < 49; i){for (int j i 1; j < 50; j){//第i個人與第j個…

如何在服務器里備份文件或系統

當我們在企業里&#xff0c;備份文件或者系統是需要經常做的&#xff0c;當我們服務器系統崩潰了或者損壞了&#xff0c;或者我們的存放的工作需求的文件夾損壞丟失&#xff0c;這時候如何我們提前備份了就可以快速回復。 那接下來我們直接上實操&#xff0c;接下來操作是在虛…

Qt實現點擊按鈕彈出側邊框(可用于登錄界面)

Qt實現點擊按鈕彈出側邊框 1、創建界面2、封面按鈕實現2.1 連接信號與槽2.2固定封面按鈕、側邊框及各個標簽位置和頂層顯示封面按鈕2.3創建側邊框狀態并在初始化列表中初始化2.4 側邊框動畫效果實現 3、視頻演示效果4、總結 1、創建界面 封面按鈕樣式表 QPushButton { border…

SQL WHERE 與 HAVING

WHERE 和 HAVING 都是 SQL 中用于篩選數據的子句&#xff0c;但它們有重要的區別 WHERE 子句 在 分組前 過濾數據 作用于 原始數據行 不能使用聚合函數 執行效率通常比 HAVING 高 SELECT column1, column2 FROM table WHERE condition; HAVING 子句 在 分組后 過濾數據 …

表格數據導出為Excel

環境及插件配置&#xff1a;&#xff08;理論上vue2應該也可以使用&#xff0c;沒有試驗過&#xff09; "vue": "^3.2.36", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", "file-saver": "^2.…

Photoshop 2025 Mac中文 Ps圖像編輯軟件

Photoshop 2025 Mac中文 Ps圖像編輯軟件 文章目錄 Photoshop 2025 Mac中文 Ps圖像編輯軟件一、介紹二、效果三、下載 一、介紹 Adobe Photoshop 2025 Mac版集成了多種強大的圖像編輯、處理和創作功能。①強化了Adobe Sensei AI的應用&#xff0c;通過智能摳圖、自動修復、圖像…

rust Send Sync 以及對象安全和對象不安全

開頭&#xff1a;菜鳥小明的疑惑 小明&#xff1a; “李哥&#xff0c;我最近學 Rust&#xff0c;感覺它超級嚴謹&#xff0c;啥 Send、Sync、對象安全、靜態分發、動態分發的&#xff0c;我都搞暈了&#xff01;為啥 Rust 要設計得這么復雜啊&#xff1f;” 小李&#xff0…

JAVA:利用 JSONPath 操作JSON數據的技術指南

1、簡述 JSONPath 是一種強大的工具&#xff0c;用于查詢和操作 JSON 數據。類似于 SQL 的語法&#xff0c;它為處理復雜的 JSON 數據結構提供了簡單且高效的解決方案。? 代碼樣例&#xff1a;https://gitee.com/lhdxhl/springboot-example.git 本文將介紹 JSONPath 的基本…