iT邦幫忙

2022 iThome 鐵人賽

DAY 2
2

OpenCV 人臉偵測

這篇教學會介紹使用 OpenCV,搭配官方提供的人臉特徵模型,偵測影像中的人臉,並透過繪製形狀的方式,使用方框標記偵測到的人臉,實現類似 AI 影像辨識的效果。

原文參考:OpenCV 人臉偵測

因為程式中的 OpenCV 會需要使用鏡頭或 GPU,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) ,並安裝 OpenCV 函式庫 ( 參考:OpenCV 函式庫 )。

Python 教學 - OpenCV 人臉偵測

下載人臉特徵模型

OpenCV 的官方 Github 提供了許多訓練好的特徵模型,只需要下載後就能使用,請從下方網址進行下載,下載後將 xml 檔案和 Python 的程式檔放在同一層目錄下。

偵測影像中的人臉

OpenCV 裡的 CascadeClassifier() 方法 ( 級聯分類器 ),可以根據所提供的模型檔案,判斷某個事件是否屬於某種結果,例如偵測人臉,如果影像中符合模型所定義的人臉屬性,就會出現這個人臉對應的屬性 ( 座標、尺寸...等 )

使用 CascadeClassifier() 後,會再透過 detectMultiScale() 進行偵測,如果偵測到臉,就會將偵測到的屬性輸出 ( 串列與字典形式 ),相關用法如下:

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 設定集聯分類器為人臉的模型 ( haarcascade_frontalface_default.xml )

faces = face_cascade.detectMultiScale(img, scaleFactor, minNeighbors, flags, minSize, maxSize)
# 偵測並取出相關屬性
# img 來源影像,建議使用灰階影像
# scaleFactor 前後兩次掃瞄偵測畫面的比例係數,預設 1.1
# minNeighbors 構成檢測目標的相鄰矩形的最小個數,預設 3
# flags 通常不用設定,若設定 CV_HAAR_DO_CANNY_PRUNING 會使用 Canny 邊緣偵測,排除邊緣過多或過少的區域
# minSize, maxSize 限制目標區域的範圍,通常不用設定

下方的例子執行後,會偵測蒙娜麗莎的人臉,並透過繪製形狀的方式,使用方框標記偵測到的人臉,如果有發生偵測到不是人臉的形狀 ( 例如鈕扣和陰影組合成很像人臉的 ),可以調整 scaleFactor 和 minNeighbors 參數再重新偵測。

參考:cvtcolor() 色彩轉換rectangle() 畫四邊形for 迴圈

import cv2
img = cv2.imread('mona.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 將圖片轉成灰階

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")   # 載入人臉模型
faces = face_cascade.detectMultiScale(gray)    # 偵測人臉

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)    # 利用 for 迴圈,抓取每個人臉屬性,繪製方框

cv2.imshow('oxxostudio', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()

Python 教學 - OpenCV 人臉偵測

如果有多張人臉,也可以順利偵測並標記 ( 圖片為 Fusilamientos de Torrijos y sus compañeros en las playas de Málaga
)。

Python 教學 - OpenCV 人臉偵測

即時偵測影片中的人臉

延伸「讀取並播放影片」文章的範例,搭配人臉偵測的方法,就可以即時偵測攝影鏡頭裡的人臉。

import cv2
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        print("Cannot receive frame")
        break
    frame = cv2.resize(frame,(540,320))              # 縮小尺寸,避免尺寸過大導致效能不好
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)   # 將鏡頭影像轉換成灰階
    faces = face_cascade.detectMultiScale(gray)      # 偵測人臉
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)   # 標記人臉
    cv2.imshow('oxxostudio', frame)
    if cv2.waitKey(1) == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Python 教學 - OpenCV 人臉偵測

參考資料

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 1 ) 進行 Python x AI 影像辨識的事前功課
下一篇
( Day 3 ) OpenCV 偵測人臉,自動加馬賽克
系列文
Python x AI 影像辨識好好玩32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言