OpenCv高階(十三)——人臉檢測

請添加圖片描述

文章目錄

  • 前言
  • 一、人臉檢測—haar特征
  • 二、人臉檢測---級聯分類器
    • 1、級聯分類器
    • 2、如何訓練級聯分類器
    • 3、已存在的級聯分類器
  • 三、代碼分析
    • 1、人臉檢測的簡單使用
    • 2、人臉微笑檢測
      • (1) 初始化視頻源
      • (2)主循環處理每一幀
      • (3) 加載分類器
      • (4)人臉檢測
      • (5)人臉標注與微笑檢測
      • (6)顯示與退出控制
  • 總結


前言

在人工智能技術飛速發展的今天,計算機視覺(Computer Vision)正悄然改變我們的生活。從手機解鎖到安防監控,從虛擬美顏到人機交互,人臉檢測(Face Detection)作為這一領域的核心技術,始終扮演著“第一雙眼睛”的角色。它不僅是理解人類身份、表情與行為的關鍵入口,更是邁向更復雜視覺任務(如人臉識別、姿態分析)的基石。
要實現人臉識別首先要判斷當前圖像中是否出現了人臉,這就是人臉檢測。只有檢測到圖像中出現了人臉,才能據此判斷這個人到底是誰。

一、人臉檢測—haar特征

調用 OpenCV 中訓練好的分類器實現人臉檢測。OpenCV 提供了訓練好的haar級聯分類器,OpenCV 還提供了使用 HOG 特征(主要用于行人檢測)和 LBP 算法的級聯分類器。
在這里插入圖片描述
特征值 = ∑特征區域中白色區域的像素值-黑色區域像素值
Haar特征反映的是圖像的灰度變化

關于 Harr 特征中的矩形框,有如下 3 個變量:
? 矩形框位置: 矩形框要逐像素點地劃過(遍歷) 整個圖像獲取每個位置的特征值。
? 矩形框大小: 矩形的大小可以根據需要進行任意調整。
? 矩形框類型: 包含垂直、水平、對角等不同類型。

二、人臉檢測—級聯分類器

在這里插入圖片描述

1、級聯分類器

分類器需要對圖像的多個特征進行識別。例如,在識別一個動物是狗(正類)還是其他動物(負類)時,直接根據多個條件進行判斷,流程是非常煩瑣的。如果先判斷該動物有幾條腿。有四條腿的動物被判斷為可能為狗,并對此范圍內的對象繼續進行分析和判斷。沒有四條腿的動物直接被否決,即不可能是狗。只通過比較腿的數目就能排除樣本集中大量的負類(如雞、鴨、鵝等不是狗的動物的實例)。級聯分類器就是基于這種思路將多個簡單的分類器按照一定的順序級聯而成的。

2、如何訓練級聯分類器

OpenCV 提供了opencv_createsamples.exe 和opencv_traincascade.exe 文件,這兩個 exe 文件可以用來訓練級聯分類器。

3、已存在的級聯分類器

訓練級聯分類器很耗時,如果訓練的數據量較大,可能需要幾天才能完成。OpenCV 提供了一些訓練好的級聯分類器供用戶使用。這些分類器可以用來檢測人臉、臉部特征(眼睛、鼻子)、人類和其他物體。這些級聯分類器以XML 文件的形式存放在 OpenCV 源文件的 data 目錄下,加載不同級聯分類器的 XML 文件就可以實現對不同對象的檢測。
cv2庫中的人臉檢測模型
外部庫(external libraries)—>Lib->SitePackages->cv2->data
(1)
在這里插入圖片描述
(2)
在這里插入圖片描述
(3)
在這里插入圖片描述
(4)可以將data中的文件復制一份到項目文件夾下
在這里插入圖片描述

三、代碼分析

1、人臉檢測的簡單使用

import cv2  # 導入OpenCV庫# 加載預訓練Haar級聯模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 讀取圖像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 轉換為灰度圖# 檢測人臉
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1,  # 圖像縮放因子(用于多尺度檢測)minNeighbors=5    # 候選框保留閾值(值越大檢測越嚴格)
)# 繪制矩形框
for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)  # 藍色邊框,線寬2像素cv2.imshow('Result', img)  # 顯示結果
cv2.waitKey(0)            # 等待按鍵關閉窗口

在這里插入圖片描述

2、人臉微笑檢測

(1) 初始化視頻源

import cv2
# cap = cv2.VideoCapture(r'../data/xiao.mp4')  # 從視頻文件讀取
cap = cv2.VideoCapture(0)  # 從攝像頭讀取(0表示默認攝像頭)if not cap.isOpened():print("視頻打開失敗")exit()

關鍵點:

VideoCapture()支持視頻文件路徑或攝像頭ID(0通常為內置攝像頭)。

isOpened()檢查視頻源是否成功打開。

(2)主循環處理每一幀

while True:ret, frame = cap.read()frame = cv2.flip(frame, 1)  # 水平翻轉(鏡像效果)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 轉換為灰度圖

關鍵點:

cap.read()返回ret(讀取是否成功)和frame(當前幀圖像)。

flip(1)實現水平鏡像,適合自拍場景。

灰度轉換減少計算量(Haar檢測需要灰度輸入)。

(3) 加載分類器

  faceCascade = cv2.CascadeClassifier(r'./myface-detect/haarcascade_frontalface_alt.xml')smiles = cv2.CascadeClassifier(r'./myface-detect/haarcascade_smile.xml')

重復加載分類器:每次循環都重新加載XML文件,浪費資源(應移出循環外)。

(4)人臉檢測

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=14, minSize=(8,8))

參數分析:

scaleFactor=1.05:縮小比例較小(檢測更細致但速度更慢)。

minNeighbors=14:較高的合并閾值(減少誤檢,但可能漏檢密集人臉)。

minSize=(8,8):允許檢測極小的人臉(可能導致噪聲誤檢)。

(5)人臉標注與微笑檢測

 for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 2), 2)  # 綠色框標記人臉roi_face = frame[y:y+h, x:x+w]  # 提取人臉區域(ROI)cv2.imshow('roi_face', roi_face)  # 單獨顯示人臉區域# 在ROI區域內檢測微笑smile = smiles.detectMultiScale(roi_face, scaleFactor=1.5, minNeighbors=2, minSize=(50,50))for (sx, sy, sw, sh) in smile:a, b = x + sx, y + sy  # 轉換坐標到原始圖像cv2.rectangle(frame, (a, b), (a+sw, b+sh), (0,0,255), 2)  # 紅色框標記微笑cv2.putText(frame, 'smile', (x,y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,2,155), 2)

關鍵邏輯:

先檢測人臉 → 截取ROI → 在ROI內檢測微笑 → 坐標轉換回原圖。

顯示ROI窗口:頻繁調用cv2.imshow()可能影響性能。

(6)顯示與退出控制

  cv2.imshow('dect', frame)if not ret:breakif cv2.waitKey(1) == 27:  # 按ESC鍵退出breakcap.release()
cv2.destroyAllWindows()

關鍵點:

waitKey(1)控制幀率(1ms延遲),按ESC鍵退出。

釋放資源(cap.release())。

效果展示:
請添加圖片描述

總結

人臉檢測作為計算機視覺的“起點”,既承載著基礎研究的智慧沉淀,也驅動著現實場景的創新落地。從Haar級聯的快速響應到MTCNN的多任務協同,從OpenCV的輕量級工具到云服務的強大API,技術的迭代始終圍繞“精準”與“高效”展開。

然而,技術的進步也伴隨著新的思考:如何在提升檢測精度的同時保護用戶隱私?如何在小算力設備上實現實時檢測?這些問題將指引未來研究的方向。無論是開發者還是普通用戶,理解人臉檢測的原理與應用,都將幫助我們更好地擁抱智能時代,在技術創新與倫理責任之間找到平衡。

期待未來,隨著算法的持續優化與跨學科融合,人臉檢測將在更多領域開啟“看見”與“理解”的新可能。

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

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

相關文章

無線通信模塊簡介

QuecPython 是運行在無線通信模塊上的開發框架。對于首次接觸物聯網開發的用戶而言,無線通信模塊可能是一個相對陌生的概念。本文主要針對無線通信和蜂窩網絡本身,以及模塊的概念、特性和開發方式進行簡要的介紹。 無線通信和蜂窩網絡 物聯網對無線通信…

Unity 中實現首尾無限循環的 ListView

之前已經實現過: Unity 中實現可復用的 ListView-CSDN博客文章瀏覽閱讀5.6k次,點贊2次,收藏27次。源碼已放入我的 github,地址:Unity-ListView前言實現一個列表組件,表現方面最核心的部分就是重寫布局&…

【C++】 類和對象(上)

1.類的定義 1.1類的定義格式 ? class為定義類的關鍵字,后跟一個類的名字,{}中為類的主體,注意類定義結束時后?分號不能省 略。類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數稱為類的?法或 者成員函數。…

Transformer架構詳解:從Attention到ChatGPT

Transformer架構詳解:從Attention到ChatGPT 系統化學習人工智能網站(收藏):https://www.captainbed.cn/flu 文章目錄 Transformer架構詳解:從Attention到ChatGPT摘要引言一、Attention機制:Transformer的…

Rock9.x(Linux)安裝Redis7

💚提醒:1)注意權限問題 💚 查是否已經安裝了gcc gcc 是C語言編譯器,Redis是用C語言開發的,我們需要編譯它。 gcc --version如果沒有安裝gcc,那么我們手動安裝 安裝GCC sudo dnf -y install…

EasyExcel使用導出模版后設置 CellStyle失效問題解決

EasyExcel使用導出模版后在CellWriteHandler的afterCellDispose方法設置 CellStyle失效問題解決方法 問題描述:excel 模版塞入數據后,需要設置單元格的個性化設置時失效,本文以設置數據格式為例(設置列的數據展示時需要加上千分位…

【Day41】

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化:調整一個批次的分布,常用與圖像數據特征圖:只有卷積操作輸出的才叫特征圖調度器:直接修改基礎學習率 卷積操作常見流程如下: 1. 輸入 → 卷積層 →…

Express教程【002】:Express監聽GET和POST請求

文章目錄 2、監聽post和get請求2.1 監聽GET請求2.2 監聽POST請求 2、監聽post和get請求 創建02-app.js文件。 2.1 監聽GET請求 1??通過app.get()方法,可以監聽客戶端的GET請求,具體的語法格式如下: // 1、導入express const express req…

C# 文件 I/O 操作詳解:從基礎到高級應用

在軟件開發中,文件操作(I/O)是一項基本且重要的功能。無論是讀取配置文件、存儲用戶數據,還是處理日志文件,C# 都提供了豐富的 API 來高效地進行文件讀寫操作。本文將全面介紹 C# 中的文件 I/O 操作,涵蓋基…

Vue-Router簡版手寫實現

1. 路由庫工程設計 首先,我們需要創建幾個核心文件來組織我們的路由庫: src/router/index.tsRouterView.tsRouterLink.tsuseRouter.tsinjectionsymbols.tshistory.ts 2. injectionSymbols.ts 定義一些注入符號來在應用中共享狀態: import…

Electron-vite【實戰】MD 編輯器 -- 文件列表(含右鍵快捷菜單,重命名文件,刪除本地文件,打開本地目錄等)

最終效果 頁面 src/renderer/src/App.vue <div class"dirPanel"><div class"panelTitle">文件列表</div><div class"searchFileBox"><Icon class"searchFileInputIcon" icon"material-symbols-light:…

Remote Sensing投稿記錄(投稿郵箱寫錯、申請大修延期...)風雨波折投稿路

歷時近一個半月&#xff0c;我中啦&#xff01; RS是中科院二區&#xff0c;2023-2024影響因子4.2&#xff0c;五年影響因子4.9。 投稿前特意查了下預警&#xff0c;發現近五年都不在預警名單中&#xff0c;甚至最新中科院SCI分區&#xff08;2025年3月&#xff09;在各小類上…

吉林第三屆全國龍舟邀請賽(大安站)激情開賽

龍舟競渡處,瑞氣滿湖光。5月31日&#xff0c;金蛇獻瑞龍舞九州2025年全國龍舟大聯動-中國吉林第三屆全國龍舟邀請賽(大安站)“嫩江灣杯”白城市全民健身龍舟賽在吉林大安嫩江灣國家5A級旅游區玉龍湖拉開帷幕。 上午9時&#xff0c;伴隨著激昂的音樂&#xff0c;活力四射的青春舞…

華為OD機試真題——通過軟盤拷貝文件(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《通過…

一起學數據結構和算法(二)| 數組(線性結構)

數組&#xff08;Array&#xff09; 數組是最基礎的數據結構&#xff0c;在內存中連續存儲&#xff0c;支持隨機訪問。適用于需要頻繁按索引訪問元素的場景。 簡介 數組是一種線性結構&#xff0c;將相同類型的元素存儲在連續的內存空間中。每個元素通過其索引值&#xff08;數…

ZYNQ sdk lwip配置UDP組播收發數據

?? 一、顛覆認知:組播 vs 單播 vs 廣播 通信方式目標設備網絡負載典型應用場景單播1對1O(n)SSH遠程登錄廣播1對全網O(1)ARP地址解析組播1對N組O(1)視頻會議/物聯網群控創新價值:在智能工廠中,ZYNQ通過組播同時控制100臺AGV小車,比傳統單播方案降低92%網絡流量! ?? 二、…

機器學習:欠擬合、過擬合、正則化

本文目錄&#xff1a; 一、欠擬合二、過擬合三、擬合問題原因及解決辦法四、正則化&#xff1a;盡量減少高次冪特征的影響&#xff08;一&#xff09;L1正則化&#xff08;二&#xff09;L2正則化&#xff08;三&#xff09;L1正則化與L2正則化的對比 五、正好擬合代碼&#xf…

Linux命令之ausearch命令

一、命令簡介 ausearch 是 Linux 審計系統 (auditd) 中的一個實用工具,用于搜索審計日志中的事件。它是審計框架的重要組成部分,可以幫助系統管理員分析系統活動和安全事件。 二、使用示例 1、安裝ausearch命令 Ubuntu系統安裝ausearch命令,安裝后啟動服務。 root@testser…

mac電腦安裝nvm

方案一、常規安裝 下載安裝腳本&#xff1a;在終端中執行以下命令來下載并運行 NVM 的安裝腳本3&#xff1a; bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置環境變量&#xff1a;安裝完成后&#xff0c;需要配置環境變量。如…

Excel 操作 轉圖片,轉pdf等

方式一 spire.xls.free&#xff08;沒找設置分辨率的方法&#xff09; macOs開發Java GUI程序提示缺少字體問題解決 Spire.XLS&#xff1a;一款Excel處理神器_spire.xls免費版和收費版的區別-CSDN博客 官方文檔 Spire.XLS for Java 中文教程 <dependency><groupI…