前言
在這個專案中,我們將建立一個使用電腦攝影機的即時人臉偵測系統.目標是存取系統的網路攝影機,並使用預先訓練的 Haar 級聯分類器即時偵測人臉.
OpenCV 裡的 CascadeClassifier() 方法,可以根據所提供的模型檔案,判斷某個事件是否屬於某種結果,
例如偵測人臉,如果影像中符合模型所定義的人臉屬性,就會出現這個人臉對應的屬性.
如果對初探 OpenCV 圖像處理有興趣 可看看
https://blog.csdn.net/2301_78959703/article/details/160959724?spm=1011.2124.3001.6209
實作
1. 首先導入必要的函式庫: OpenCV 和 NumPy. OpenCV 是一個功能強大的影像處理庫,而 NumPy 用於處理資料數組和矩陣.
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)
參數說明
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)
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()
留言