使用 OpenCV 和 dlib 進行人臉檢測

文章目錄

  • 1. 什么是 dlib
  • 2. 前期準備介紹
    • 2.1 環境準備
    • 2.2 dlib 的人臉檢測器
  • 3. 代碼實現
    • 3.1 導入庫
    • 3.2 加載檢測器
    • 3.3 讀取并調整圖像大小
    • 3.4 檢測人臉
    • 3.5 繪制檢測框
    • 3.6 顯示結果
  • 4. 完整代碼
  • 5. 優化與改進
    • 5.1 提高檢測率
    • 5.2 處理 BGR 與 RGB 問題
  • 6. 總結

人臉檢測是計算機視覺中的基礎任務,廣泛應用于安防監控、人臉識別、美顏相機等場景。本文將介紹如何結合 OpenCVdlib 庫實現高效的人臉檢測,并詳細解析代碼實現。


1. 什么是 dlib

dlib 是一個現代化的 C++ 機器學習工具庫,同時也提供 Python 接口。它由 Davis King 開發并維護,廣泛應用于計算機視覺、圖像處理和機器學習任務。

主要特點

  1. 高性能:優化的 C++ 實現,運行速度快
  2. 跨平臺:支持 Windows、Linux、macOS
  3. 豐富的功能:人臉檢測、特征點識別、物體檢測、深度學習等
  4. 易用的 Python API:與 NumPy、OpenCV 無縫集成
  5. 開源免費:采用 Boost 軟件許可,可商用

2. 前期準備介紹

2.1 環境準備

在開始之前,請確保安裝以下 Python 庫:

pip install opencv-python dlib
  • OpenCV:用于圖像讀取、處理和顯示。
  • dlib:提供高性能的機器學習模型,包括人臉檢測和特征點識別。

2.2 dlib 的人臉檢測器

dlib 提供了兩種主要的人臉檢測方法:

  1. HOG(方向梯度直方圖)+ SVM(支持向量機)get_frontal_face_detector
    • 適用于 CPU 環境,速度較快,但對小臉或側臉檢測效果一般。
  2. CNN(卷積神經網絡)dlib.cnn_face_detection_model_v1
    • 檢測精度更高,但計算量較大,適合 GPU 加速。

本文主要介紹 HOG + SVM 方法,因其在速度和精度之間取得了較好的平衡。


3. 代碼實現

3.1 導入庫

import cv2
import dlib

3.2 加載檢測器

detector = dlib.get_frontal_face_detector()  # 使用HOG+SVM檢測器

3.3 讀取并調整圖像大小

img = cv2.imread('hezhao.jpg')  # 讀取圖像(BGR格式)
img = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)  # 縮小50%,提高檢測速度
  • resize 可以縮小圖像,加快檢測速度(但可能影響小臉檢測)。

3.4 檢測人臉

faces = detector(img, 0)  # 第二個參數0表示不進行上采樣
  • 參數 0 表示不對圖像進行上采樣(適用于原圖或已縮小的圖像)。
  • 如果檢測不到小臉,可以嘗試 faces = detector(img, 1),表示上采樣一次。

3.5 繪制檢測框

for face in faces:  # 遍歷檢測到的人臉x1, y1 = face.left(), face.top()  # 左上角坐標x2, y2 = face.right(), face.bottom()  # 右下角坐標cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)  # 畫綠色矩形框
  • cv2.rectangle 用于在圖像上繪制矩形框,參數:
    • (x1, y1):左上角坐標
    • (x2, y2):右下角坐標
    • (0, 255, 0):綠色(BGR格式)
    • 2:線寬

3.6 顯示結果

cv2.imshow("result", img)
cv2.waitKey(0)  # 按任意鍵關閉窗口
cv2.destroyAllWindows()

顯示效果如下:

在這里插入圖片描述


4. 完整代碼

import cv2
import dlib# 1. 加載檢測器
detector = dlib.get_frontal_face_detector()# 2. 讀取圖像并調整大小
img = cv2.imread('hezhao.jpg')
img = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)  # 縮小50%# 3. 檢測人臉
faces = detector(img, 0)  # 0表示不進行上采樣# 4. 繪制檢測框
for face in faces:x1, y1 = face.left(), face.top()x2, y2 = face.right(), face.bottom()cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)  # 綠色框# 5. 顯示結果
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 優化與改進

5.1 提高檢測率

  • 上采樣(Upsample)
    faces = detector(img, 1)  # 上采樣一次,檢測更小人臉
    
  • 使用 CNN 模型(更精準但更慢):
    cnn_detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")
    faces = cnn_detector(img, 0)
    

5.2 處理 BGR 與 RGB 問題

OpenCV 默認讀取 BGR 格式,而 dlib 的 HOG 檢測器需要 RGB 格式,可以轉換:

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 轉換為RGB
faces = detector(img_rgb, 0)

6. 總結

  • dlib 的 HOG 檢測器 在 CPU 上運行速度快,適合實時檢測。
  • OpenCV 負責圖像讀取、處理和顯示,與 dlib 結合使用非常方便。
  • 可以通過 上采樣CNN 模型 提高檢測精度。

希望這篇教程能幫助你快速上手 OpenCV + dlib 人臉檢測!🚀

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

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

相關文章

spring 的PropertySource 類與 @PropertySource 注解詳解與對比

PropertySource 類與 PropertySource 注解詳解與對比 在這里插入圖片描述 一、PropertySource 類詳解 1. 類型與作用 類型:接口(org.springframework.core.env.PropertySource)作用:抽象配置數據源,提供統一的鍵值…

Java后端開發day37--源碼解析:TreeMap可變參數--集合工具類:Collections

(以下內容全部來自上述課程) 1. TreeMap 1.1 須知 1.1.1 Entry 節點初始為黑色:提高代碼閱讀性 1.1.2 TreeMap中的成員變量 comparator:比較規則root:紅黑樹根節點的地址值size:集合的長度和紅黑樹…

基于Playwright的瀏覽器自動化MCP服務

一、服務定位與核心功能 github.com/executeautomation/mcp-playwright 是一個基于 Playwright(微軟開源的跨瀏覽器自動化測試框架)的 Model Context Protocol (MCP) 服務,核心功能是將瀏覽器自動化能力集成到大語言模型(LLM&…

OSPF網絡協議

OSPF(Open Shortest Path First)是一種鏈路狀態路由協議,屬于IGP(內部網關協議),用于在單一自治系統(AS)內動態分發路由信息。它通過計算最短路徑(基于Dijkstra算法&…

Ubuntu 22.04.4操作系統初始化詳細配置

上一章節,主要講解了Ubuntu 22.04.4操作系統的安裝,但是在實際生產環境中,需要對Ubuntu操作系統初始化,從而提高系統的性能和穩定性。 一、查看Ubuntu系統版本和內核版本 # 查看系統版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux應用】開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADXA ZERO 3為例)

【Linux應用】開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADXA ZERO 3為例) 參考: ZERO 3 | Radxa Docs 大部分的Linux開發板等設備都大同小異 如樹莓派、香橙派、STM32MP135的Linux開發板等 …

Redis使用總結

NoSQL 1.1為什么要用NoSQL 面對現在用戶數據的急劇上升,我們需要對這些用戶數據進行挖掘,傳統的關系型數據庫已經不適合這些 應用了.Nosql 的發展可以很了的處理這些大的數據. 1.2什么是NoSQL Not Only Sql->NoSQL(不僅僅是SQL) 非關系型數據庫.隨…

Unity ML-Agents + VScode 環境搭建 Windows

安裝Unity 先去官網下載Unity Hub,然后安裝在D盤就可以了,你需要手機上安裝一個Unity Connect進行賬號注冊。 詳細的注冊可以參考: https://blog.csdn.net/Dugege007/article/details/128472571 注冊好了以后登入電腦端的Unity Hub&#x…

Linux電源管理(2)_常規的電源管理的基本概念和軟件架構

原文: Linux電源管理(2)_Generic PM之基本概念和軟件架構 1. 前言 Linux系統中那些常規的電源管理手段,包括關機(Power off)、待機(Standby or Hibernate)、重啟(Reboot)等。這些…

機器學習基礎理論 - 分類問題評估指標

幾個定義:混淆矩陣 TP: True Positives, 表示實際為正例且被分類器判定為正例的樣本數FP: False Positives, 表示實際為負例且被分類器判定為正例的樣本數FN: False Negatives, 表示實際為正例但被分類器判定為負例的樣本數TN: True Negatives, 表示實際為負例且被分類…

在線教育系統開發常見問題及解決方案:源碼部署到運營維護

當下,越來越多的教育機構、企業培訓部門以及創業者,選擇開發屬于自己的在線教育系統。然而,從源碼部署到實際運營,整個過程中常常會遇到一系列技術與管理難題。今天,筆者將從在線教育系統源碼維護、運營等幾個方向為大…

RAG(Retrieval-Augmented Generation,檢索增強生成)

RAG(Retrieval-Augmented Generation,檢索增強生成)是一種結合 信息檢索 和 文本生成 的技術,旨在提升大語言模型(LLM)生成內容的準確性和時效性。其核心思想是:先檢索相關知識,再基…

項目實戰 -- 狀態管理

redux基礎 還記得好久好久之前就想要實現的一個功能嗎? 收起側邊欄折疊菜單,沒錯,現在才實現 因為不是父子通信,所以處理起來相對麻煩一點 可以使用狀態樹或者中間人模式 這就需要會redux了 Redux工作流: 異步就…

Go語言之路————指針、結構體、方法

Go語言之路————指針、結構體、方法 前言指針結構體聲明初始化使用組合引用結構體和指針結構體的標簽 方法例子結合結構體總結 前言 我是一名多年Java開發人員,因為工作需要現在要學習go語言,Go語言之路是一個系列,記錄著我從0開始接觸Go…

[創業之路-390]:人力資源 - 社會性生命系統的解構與重構:人的角色嬗變與組織進化論

前言: 人、財、物、信息、機制、流程、制度、方法共同組合了一個持續的消耗資源、持續的價值創造、持續面臨生存與發展、遺傳與變異的社會性生命系統。 "人"是所有社會性生命系統最最基礎性的要素,它彌漫在系統中多維立體空間的不同節點上&am…

JS執行器在UI自動化測試中的應用

前言 在進行UI自動化過程會遇到滾動條下拉、隱藏元素定位、只讀屬性元素的編輯、富文本處理等,此時可以使用JS執行器簡化我們的一些處理操作。 具體應用 JS執行器的使用步驟: 1.先寫個JS腳本,如果需要獲取操作后的值,JS腳本前面…

解析Suna:全球首款開源通用AI智能體

導語: 嘿,哥們兒,最近 AI Agent 這塊兒挺火的,有個叫 Suna 的開源項目冒出來挺快!聽說只用了 3 周就開發出來了,但功能上感覺已經能跟那個商業版的 Manus掰掰手腕了。它能幫你搞定瀏覽器自動化、管文件、爬…

模板方法模式:定義算法骨架的設計模式

模板方法模式:定義算法骨架的設計模式 一、模式核心:模板方法定義算法骨架,具體步驟延遲到子類實現 在軟件開發中,經常會遇到這樣的情況:某個算法的步驟是固定的,但具體步驟的實現可能因不同情況而有所不…

淺談Java 內存管理:棧與堆,垃圾回收

在Java編程世界里,內存管理是一項極為關鍵的技能,它就像程序運行背后的“隱形守護者”,默默影響著程序的性能與穩定性。今天,咱們就來簡單學習一下Java內存管理中的兩大核心要點:棧與堆的內存分配機制,以及…

【WebGL小知識】WebGL平臺上不同Json的比較

今天來總結一下WebGL平臺上不同Json插件的差別,話不多說直接開始。 JsonUtility JsonUtility是Unity自帶的Json解析,無需另外安裝插件。 優點: Unity自帶,兼容性好,WebGL平臺可以使用輕量級,性能較好。 …