跳到主要內容

OpenCV 的即時人臉偵測

前言

在這個專案中,我們將建立一個使用電腦攝影機的即時人臉偵測系統.目標是存取系統的網路攝影機,並使用預先訓練的 Haar 級聯分類器即時偵測人臉.

OpenCV 裡的 CascadeClassifier() 方法,可以根據所提供的模型檔案,判斷某個事件是否屬於某種結果,

例如偵測人臉,如果影像中符合模型所定義的人臉屬性,就會出現這個人臉對應的屬性.

如果對初探 OpenCV 圖像處理有興趣 可看看

https://blog.csdn.net/2301_78959703/article/details/160959724?spm=1011.2124.3001.6209


實作

1. 首先導入必要的函式庫: OpenCV 和 NumPy. OpenCV 是一個功能強大的影像處理庫,而 NumPy 用於處理資料數組和矩陣.


import cv2
import numpy as np



2. 載入 Haar 級聯分類器,Haar 級聯分類器是一個預訓練模型,可以偵測人臉.OpenCV 以 XML 檔案的形式提供訓練模型.該文件包含識別圖像中人臉所需的資料.


我們將使用 cv2.CascadeClassifier() 函數將此檔案載入到程式中,並引用儲存在 OpenCV 資料集中的預訓練人臉偵測模型.


face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')



3. 存取網路攝影機,要擷取即時視頻,我們將使用 cv2.VideoCapture() 函數.參數 0 用於選擇預設網路攝影機.如果您連接了多個鏡頭,可以變更此參數值以使用不同的攝影機.


video_capture = cv2.VideoCapture(0)



4. while 循環從網路攝影機捕捉 Frames. 每一 Frames 都會逐一處理,以即時偵測人臉,直到按下 q 鍵退出.


while True:

    ret, frame = video_capture.read()

    if not ret:

        print("無法從攝影機讀取畫面")

        break



5. 將影格轉換為灰階影像

人臉偵測在灰階影像上效率更高,因為它可以減少資料量並加快偵測速度.我們將使用 cv2.cvtColor() 函數將每一幀轉換為灰階影像


gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)




6. 人臉偵測,有了灰階影像幀,接下來我們將使用 detectMultiScale() 函數來偵測人臉


faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)



參數說明

detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)


scaleFactor 前後兩次掃瞄偵測畫面的比例係數,預設 1.1


minNeighbors 構成檢測目標的相鄰矩形的最小個數,預設 3


flags 用於指定如何處理影像,這個參數會影響內部處理,通常可以使用預設值


minSize: 被檢測對象的最小尺寸


maxSize 被檢測對象的最大尺寸




7. 在偵測到的人臉周圍繪製一個矩形框


既然我們已經可以偵測到影片畫面中的人臉,現在讓我們透過視覺標記方式增強我們的程式,我們將在偵測到的人臉周圍繪製矩形框,以便更容易在影片畫面中辨識它們.


我們將偵測到的人臉周圍繪製一個矩形. etectMultiScale() 函數提供人臉左上角和右下角的座標,我們將使用這些座標來繪製矩形.


for (x, y, w, h) in faces:

cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)


參數說明

x, y:矩形的左上角座標

w, h:長方形的寬度和高度

(255, 0, 0):BGR 色彩空間, 矩形的顏色(本例為藍色).您可以將其修改為紅色或綠色

2:線條類型, 矩形的厚度(以像素為單位)



8. 顯示偵測到人臉的影像

繪製完矩形框後,我們需要顯示包含偵測矩形框的​​影片畫面.為此,我們使用 cv2.imshow() 來顯示視訊串流


cv2.imshow('人臉偵測', frame)



9. 釋放資源

循環結束後,務必釋放攝影機資源並關閉 OpenCV 打開的所有視窗。


video_capture.release()

cv2.destroyAllWindows()



完整代碼

import cv2

import numpy as np

 

 

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 設定集聯分類器為人臉的模型 ( haarcascade_frontalface_default.xml )

 

video_capture = cv2.VideoCapture(0)  # 開啟攝影機

 

if not video_capture.isOpened():

    print("訪問攝影機時出錯")

    exit()

    

while True:

    # Capture frame-by-frame

    ret, frame = video_capture.read()

    if not ret:

        print("無法從攝影機讀取畫面")

        break

    

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 將圖像轉換為灰階圖像

    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30))  # 偵測人臉

    

    for (x, y, w, h) in faces:  # 繪製人臉的邊界框

        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

    

    cv2.imshow('人臉偵測', frame)  # 顯示結果

    

    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按 'q' 鍵退出

        break

 

video_capture.release()

 

cv2.destroyAllWindows()



測試





留言

這個網誌中的熱門文章

初探 Vue 呼叫 API 出現 CORS 跨來源資源共享 問題原因

提要:   在 {初探Vue 與 Spring boot 的對話} 專案 ,前端 Vue 應用程式 串接 後端 API 伺服器 ,axios 呼叫 API 時出現以下,”無法取得回應內容 (No 'Access-Control-Allow-Origin' header is present on the requested resource):” 錯誤訊息,根據查找相關資料 ,出現以下原因。 瀏覽器開發工具 錯誤訊息 畫面 錯誤原因: “ Access to XMLHttpRequest at ” from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource” 瀏覽器為了安全考量,實施了同源政策。 當您的前端應用程式 (http://localhost:8080) 嘗試呼叫一個不同來源 (不同協議、不同域名或不同埠號) 的 API 伺服器 (http://localhost:8088) 時,瀏覽器會主動阻止這個請求,除非伺服器明確地允許這個跨來源的存取。 同源政策限制(Same-Origin Policy): 同源政策限制了程式碼和不同網域資源間的互動,同源是指兩份網頁具備相同協定、埠號(如果有指定)以及主機位置 範例: 表列哪些 URL 與 URL http://www.example.com/api/p1 屬於同源: URL                                                   | 結果   | 原因 --------------------------------------------------------------------- http://www.example.com/api/p2     |...

初探 Vue 與 Spring boot 的對話之Frontend (Vue-Frontend)

  Front-end Vue 使用 REST API 建立 Vite 專案 可參考 { Vue 3 初探}  文章 danny@Danny-Yu projects % npm create vite@latest Need to install the following packages: create-vite@8.2.0 Ok to proceed? (y) y > npx > "create-vite" │ ◇   Project name: │   vue-frontend │ ◇   Select a framework: │   Vue │ ◇   Select a variant: │   TypeScript │ ◇   Use rolldown-vite (Experimental)?: │   No │ ◇   Install with npm and start now? │   Yes │ ◇   Scaffolding project in /Users/danny/Desktop/projects/vue-frontend... │ ◇   Installing dependencies with npm... added 47 packages, and audited 48 packages in 27s 6 packages are looking for funding   run `npm fund` for details found 0 vulnerabilities │ ◇   Starting dev server... > vue-frontend@0.0.0 dev > vite   VITE v7.2.4   ready in 411 ms   ➜   Local:   http://localhost:5173/   ➜   Network: use --host to expose   ➜   press h + enter to show...

初探 Spring 中的循環依賴

原因: 當兩個或多個 bean 直接或間接地相互依賴時, 就會出現 Circular Dependency (循環依賴) 如: Bean A -> Bean B -> Bean A import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanA {          @Autowired     private BeanB beanB;     public String sayHi() {         return "Hi! 我是 Class A.";     } } import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanB {          @Autowired     private BeanA beanA;     public String sayHi() {         return "Hi! 我是 Class B.";     } } 編譯時不會出現問題 danny@Danny-Yu demo % mvn clean install -Dmaven.test.skip=true                           ... ... [INFO] Installing /Users/danny/Desktop/projects/demo/target/dem...