基于OpenCV的人臉微笑檢測實現

文章目錄

    • 引言
    • 一、技術原理
    • 二、代碼實現
      • 2.1 關鍵代碼解析
        • 2.1.1 模型加載
        • 2.1.2 圖像翻轉
        • 2.1.3 人臉檢測 + 微笑檢測
      • 2.2 顯示效果
    • 三、參數調優建議
    • 四、總結

引言

在計算機視覺領域,人臉檢測表情識別一直是熱門的研究方向。今天我將分享一個使用Python和OpenCV實現的實時人臉微笑檢測系統。這個系統能夠通過攝像頭捕捉視頻流,實時檢測人臉并識別微笑表情,非常適合初學者學習計算機視覺的基礎應用。

一、技術原理

本實現主要基于OpenCV提供的Haar級聯分類器,使用了兩個預訓練模型:

  1. haarcascade_frontalface_default.xml - 用于人臉檢測
  2. haarcascade_smile.xml - 用于微笑檢測

Haar級聯分類器是一種基于機器學習的物體檢測方法,由Paul Viola和Michael Jones在2001年提出。它通過訓練大量正負樣本,學習物體的特征模式,從而實現快速檢測。

二、代碼實現

import cv2# 加載預訓練模型
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier("haarcascade_smile.xml")
cap = cv2.VideoCapture('smile.mp4') #初始化攝像頭while True:     #處理每一幀ret,image = cap.read()   #讀取一幀image = cv2.flip(image,1)    #圖片翻轉,水平翻轉(鏡像)# 沒有讀到,直接退出if ret is None:break# 轉換為灰度圖像gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)# 人臉檢測faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1,minNeighbors=15,minSize=(5,5) )# 處理每個人臉for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x + w,y + h),(0,255,0),2)# 提取人臉ROI區域(灰度)roi_gray_face = gray[y:y+h,x:x+w]cv2.imshow('Face ROI',roi_gray_face)# 微笑檢測,僅在人臉區域內檢測smiles = smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=2,minSize=(50,50))for (sx,sy,sw,sh) in smiles:# 繪制微笑區域a = x + sxb = y + sycv2.rectangle(image,(a,b),(a+sw,b+sh),(255,0,0),2)# 顯示"smile"文字cv2.putText(image,"smile",(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,255),thickness=2)# 顯示結果cv2.imshow("Smile Detection",image)key = cv2.waitKey(25)if key ==27:  # ESC鍵退出break# 釋放資源
cap.release()
cv2.destroyAllWindows()

2.1 關鍵代碼解析

2.1.1 模型加載
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier("haarcascade_smile.xml")

這兩行代碼加載了OpenCV提供的預訓練Haar級聯分類器模型。


2.1.2 圖像翻轉
image = cv2.flip(image, 1)
  1. cv2.flip()函數

    • 作用:翻轉輸入圖像(水平、垂直或同時翻轉)。
    • 參數:
      • 第1個參數 image:輸入的圖像(NumPy數組)。
      • 第2個參數 1:翻轉模式的標志。
        • 0:垂直翻轉(沿x軸翻轉)。
        • 1:水平翻轉(沿y軸翻轉,即鏡像效果)。
        • -1:同時水平和垂直翻轉。
  2. flipCode=1 的效果
    假設原圖為:

			原圖:    [A B C]   → 翻轉后: [C B A][D E F]             [F E D]
  • 每一行的元素順序被反轉,但行的順序不變。

2.1.3 人臉檢測 + 微笑檢測
for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x + w,y + h),(0,255,0),2)# 提取人臉所在區域,多通道形式# roiColorFace = image(y:y+h,x:x+w)# 提取人臉所在區域,單通道形式roi_gray_face = gray[y:y+h,x:x+w]cv2.imshow('lian',roi_gray_face)# 微笑檢測,僅在人臉區域內檢測smiles = smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=2,minSize=(50,50))for (sx,sy,sw,sh) in smiles:# 繪制微笑區域a = x + sxb = y + sycv2.rectangle(image,(a,b),(a+sw,b+sh),(255,0,0),2)# 顯示文字“smile” 表示微笑了cv2.putText(image,"smile",(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,255),thickness=2)

這段代碼是一個 人臉檢測 + 微笑檢測 的程序,主要使用了 OpenCV 的 Haar 級聯分類器(detectMultiScale)來檢測人臉和微笑。以下是詳細解析:


代碼功能概述

  1. 檢測人臉(在 faces 中存儲的人臉矩形框)。
  2. 提取人臉區域(灰度圖 roi_gray_face)。
  3. 在人臉區域內檢測微笑smiles)。
  4. 繪制人臉框和微笑框,并標注文字“smile”。

代碼逐行解析

1. 遍歷檢測到的人臉

for (x, y, w, h) in faces:
  • faces 是一個包含人臉矩形框的列表,每個框由 (x, y, w, h) 表示:
    • (x, y):人臉左上角坐標。
    • (w, h):人臉的寬度和高度。

2. 繪制人臉矩形框

cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
  • 在原始圖像 image 上繪制綠色矩形框(RGB (0,255,0)),線寬為 2

3. 提取人臉區域(灰度圖)

roi_gray_face = gray[y:y+h, x:x+w]
cv2.imshow('lian', roi_gray_face)
  • gray 是灰度圖像(單通道)。
  • roi_gray_face 是從 gray 中截取的人臉區域。
  • cv2.imshow('lian', roi_gray_face) 顯示人臉區域的灰度圖(窗口名 'lian')。

4. 在人臉區域內檢測微笑

smiles = smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=2,minSize=(50, 50)
)
  • smile 是一個訓練好的 Haar 級聯分類器(用于微笑檢測)。
  • 參數說明
    • scaleFactor=1.5:每次圖像縮放的比例(越大檢測越快,但可能漏檢)。
    • minNeighbors=2:候選框至少需要多少個鄰近檢測才被確認(越小誤檢越多)。
    • minSize=(50, 50):微笑區域的最小尺寸(小于該尺寸的忽略)。

5. 遍歷檢測到的微笑區域

for (sx, sy, sw, sh) in smiles:
  • smiles 包含微笑矩形框 (sx, sy, sw, sh),坐標是相對于 roi_gray_face(人臉區域)的。

6. 繪制微笑框(藍色)

a = x + sx  # 轉換到原始圖像的坐標
b = y + sy
cv2.rectangle(image, (a, b), (a + sw, b + sh), (255, 0, 0), 2)
  • (a, b) 是微笑框在原始圖像 image 中的左上角坐標。
  • 繪制藍色矩形框(RGB (255,0,0)),線寬 2

7. 標注文字“smile”

cv2.putText(image, "smile", (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 255, 255), 2)
  • 在人臉框左上角 (x, y) 處顯示黃色文字“smile”:
    • 字體:cv2.FONT_HERSHEY_COMPLEX_SMALL
    • 字號:1
    • 顏色:(0, 255, 255)(黃色)。
    • 線寬:2

代碼執行流程

  1. 輸入圖像 → 檢測人臉 → 繪制綠色人臉框。
  2. 提取人臉區域 → 檢測微笑 → 繪制藍色微笑框。
  3. 標注“smile”文字 → 顯示結果。

注意事項

  1. 依賴 Haar 級聯分類器
    • facessmiles 是由 cv2.CascadeClassifier 檢測得到的。
    • 通常需要加載預訓練模型:
      face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
      smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
      
  2. 參數調優
    • scaleFactorminNeighbors 影響檢測精度和速度,需根據實際場景調整。
  3. 坐標轉換
    • 微笑檢測是在人臉區域 (roi_gray_face) 內進行的,繪制時需要轉換回原始圖像坐標。

2.2 顯示效果

    # 顯示結果cv2.imshow("dect",image)key = cv2.waitKey(25)if key ==27:break
cap.release()
cv2.destroyAllWindows()
  • 顯示效果如下,我們插入一段視頻,在視頻中對人物進行微笑檢測,并畫出檢測框:

在這里插入圖片描述

三、參數調優建議

  1. 人臉檢測參數

    • minNeighbors值越大,檢測越嚴格,但可能漏檢
    • scaleFactor通常在1.01-1.5之間
  2. 微笑檢測參數

    • 由于微笑區域相對較小,minSize不宜設置過大
    • minNeighbors可以適當調小以避免漏檢

四、總結

本文介紹了一個基于OpenCV Haar級聯分類器的實時微笑檢測系統。雖然Haar級聯分類器在復雜場景下可能表現不佳,但它的計算效率高,非常適合初學者學習和快速原型開發。通過調整參數和優化流程,可以在實際應用中獲得不錯的效果。

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

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

相關文章

Java 大視界 -- 基于 Java 的大數據分布式存儲在視頻會議系統海量視頻數據存儲與回放中的應用(263)

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

Kotlin 極簡小抄 P9 - 數組(數組的創建、數組元素的訪問與修改、數組遍歷、數組操作、多維數組、數組與可變參數)

Kotlin 概述 Kotlin 由 JetBrains 開發,是一種在 JVM(Java 虛擬機)上運行的靜態類型編程語言 Kotlin 旨在提高開發者的編碼效率和安全性,同時保持與 Java 的高度互操作性 Kotlin 是 Android 應用開發的首選語言,也可…

gitlab+portainer 實現Ruoyi Vue前端CI/CD

1. 場景 最近整了一個Ruoyi Vue 項目,需要實現CICD,經過一番坎坷,最終達成,現將技術要點和踩坑呈現。 具體操作流程和后端大同小異,后端操作參考連接如下: https://blog.csdn.net/leinminna/article/detai…

RNN神經網絡

RNN神經網絡 1-核心知識 1-解釋RNN神經網絡2-RNN和傳統的神經網絡有什么區別?3-RNN和LSTM有什么區別?4-transformer的歸一化有哪幾種實現方式 2-知識問答 1-解釋RNN神經網絡 Why:與我何干? 在我們的生活中,很多事情…

javaweb-html

1.交互流程: 瀏覽器向服務器發送http請求,服務器對瀏覽器進行回應,并發送字符串,瀏覽器能對這些字符串(html代碼)進行解釋; 三大web語言:(1)html&#xff1a…

從混亂到高效:我們是如何重構 iOS 上架流程的(含 Appuploader實踐)

從混亂到高效:我們是如何重構 iOS 上架流程的 在開發團隊中,有一類看不見卻至關重要的問題:環境依賴。 特別是 iOS App 的發布流程,往往牢牢綁死在一臺特定的 Mac 上。每次需要發版本,都要找到“那臺 Mac”&#xff…

FPGA:CLB資源以及Verilog編碼面積優化技巧

本文將先介紹Kintex-7系列器件的CLB(可配置邏輯塊)資源,然后分享在Verilog編碼時節省CLB資源的技巧。以下內容基于Kintex-7系列的架構特點,并結合實際設計經驗進行闡述。 一、Kintex-7系列器件的CLB資源介紹 Kintex-7系列是Xilin…

在linux里上傳本地項目到github中

首先先安裝git,安裝完git后,輸入如下操作指令: 輸入自己的用戶名和郵箱(為注冊GITHUB賬號時的用戶名和郵箱): git config --global user.name "111"git config --global user.email "121…

鴻蒙Flutter實戰:25-混合開發詳解-5-跳轉Flutter頁面

概述 在上一章中,我們介紹了如何初始化 Flutter 引擎,本文重點介紹如何添加并跳轉至 Flutter 頁面。 跳轉原理 跳轉原理如下: 本質上是從一個原生頁面A 跳轉至另一個原生頁面 B,不過區別在于,頁面 B是一個頁面容器…

c語言 寫一個五子棋

c語言 IsWin判贏 display 畫 10 x 10 的棋盤 判斷落子的坐標是否已有棋子 判斷落子坐標范圍是否超出范圍 // 五子棋 #include <stdio.h> #include <stdlib.h>// 畫棋盤 10 x 10的棋盤&#xff0c;len為行數 void display(char map[][10], int len) {system(&q…

格雷希爾快速封堵接頭,解決新能源汽車的氣密性檢測和三電系統的綜合測試

我國的新能源汽車已經遙遙領先&#xff0c;讓其他國家望塵莫及。格雷希爾GripSeal&#xff0c;為新能源汽車制造業提供快速可靠的密封連接器&#xff0c;讓測試速度加倍。以好抓取、易密封為設計理念&#xff0c;實現一秒連接&#xff0c;瞬時密封的高效性能。通過持續的產品設…

人工智能全景解析:從技術原理到未來趨勢的深度探索

人工智能(AI)作為21世紀最具變革性的技術之一&#xff0c;正以前所未有的速度重塑著人類社會。從智能手機中的語音助手到工廠里的智能機器人&#xff0c;從醫療診斷系統到金融風控模型&#xff0c;AI技術已滲透到我們生活和工作的方方面面。本文將全面解析人工智能的發展歷程、…

[密碼學實戰]使用C語言實現TCP服務端(二十九)

[密碼學實戰]使用C語言實現TCP服務端(二十九) 引言 TCP(傳輸控制協議)是互聯網通信中最核心的協議之一,它提供可靠的、面向連接的數據傳輸服務。通過C語言的標準Socket API,開發者可以靈活地實現TCP客戶端和服務端程序。本文將詳細講解TCP通信的原理,并提供完整的代碼…

IPv4 地址嵌入 IPv6 的前綴轉換方式詳解

1. 概述 在 IPv4 和 IPv6 網絡共存的過渡期&#xff0c;NAT64&#xff08;Network Address Translation 64&#xff09;是一種關鍵技術&#xff0c;用于實現 IPv6-only 網絡與 IPv4-only 網絡的互操作。NAT64 前綴轉換通過將 IPv4 地址嵌入到 IPv6 地址中&#xff0c;允許 IPv…

動態神經網絡(Dynamic NN)在邊緣設備的算力分配策略:MoE架構實戰分析

一、邊緣計算場景的算力困境 在NVIDIA Jetson Orin NX&#xff08;64TOPS INT8&#xff09;平臺上部署視頻分析任務時&#xff0c;開發者面臨三重挑戰&#xff1a; 動態負載波動 視頻流分辨率從480p到4K實時變化&#xff0c;幀率波動范圍20-60FPS 能效約束 設備功耗需控制在1…

算法優選系列(9.BFS 解決拓撲排序)

目錄 拓撲排序簡介&#xff1a; ?編輯 課程表&#xff08;medium&#xff09;&#xff1a; 課程表II&#xff08;medium&#xff09;: 火星詞典&#xff08;hard&#xff09;&#xff1a; 拓撲排序簡介&#xff1a; 有向無環圖&#xff08;DAG圖&#xff09; 如上圖每條邊…

SpringBoot3+Vue3(1)-后端 請求頭校驗,jwt退出登錄,mybaits實現數據庫用戶校驗

1.后端&#xff1a;jwt請求頭校驗 解析 工具類jwtUtils 解析token 令牌是否過期&#xff0c;驗證 正常、異常、運行時錯誤 倒入工具類是resource 工具類中添加解析用戶的方法&#xff1a; 在 在工具類添加id解析 此處調用 添加controller做測試 測試&…

【免殺】C2免殺技術(八)APC注入

本文主要寫點自己的理解&#xff0c;如有問題&#xff0c;請諸位指出&#xff01; 概念和流程 “APC注入”&#xff08;APC Injection&#xff09;是免殺與惡意代碼注入技術中的一種典型方法&#xff0c;主要用于在目標進程中遠程執行代碼&#xff0c;常見于后門、遠控、植入型…

git工具使用

安裝Git 在開始使用Git之前&#xff0c;需要在本地計算機上安裝Git工具。Git支持Windows、macOS和Linux系統。可以從Git官方網站下載適合操作系統的安裝包&#xff0c;并按照安裝向導進行安裝。 bash復制插入 # 在Linux上安裝Git sudo apt-get install git# 在macOS上安裝Git…

SpringBoot微服務編寫Dockerfile流程及問題匯總

背景 跟 Docker 磕了兩天&#xff0c;將一個包含 N 個微服務的應用部署包改造&#xff0c;使其能夠生成 Docker 鏡像&#xff0c;并在 Docker 容器中運行。幾年前玩過 Docker&#xff0c;隱約記得幾個命令「Dockerfile 命令&#xff1a;黑卡飲料、山楂果費、哦SUV&#xff0c;…