【OpenCV人臉檢測】4. 繪製人臉與人眼區域

【 1. 繪製矩形 】

  • 通過 OpenCV 的 Harr 分類器檢測人臉,並輸出識別結果(x,y,w,h)。
    圖片座標以左上角爲原點;
    (x,y)代表人臉區域左上角座標;
    w代表人臉區域的寬度(width);
    h代表人臉區域的高度(height)。
  • 例如:
    在這裏插入圖片描述
  • OpenCV 繪製矩形函數:
#img 爲目標圖片
#左上角座標爲(x,y),右下角座標爲(x+w,y+h),
#顏色(B,G,R),(255,0,0) 表示藍色,(0,255,0) 表示綠色,(0,0,255) 表示紅色,3 表示 BGR 三個通道。
# 2代表邊框線粗度爲 2。
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)

在這裏插入圖片描述

【 2. 繪製圖片中人臉區域 】

使用 OpenCV 分類器檢測人臉之後,一張圖片中可能包含多個人臉,所以對每一個識別到的人臉都繪製對應的矩形框。

import cv2
image = cv2.imread('picture.jpg')# 讀取圖片
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 轉換爲灰度圖片

#cv2.CascadeClassifier()爲加載模型方法
face = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 人臉檢測器

# face_cascade.detectMultiScale() 爲人臉檢測方法, gray 爲待檢測灰度圖, 1.1 表示檢測框按 1.1 的比例放大, 3 表示一個目標至少要被檢測到 3 次纔算真正的目標。
faces = face.detectMultiScale(gray,1.1,3) # 識別人臉

for (x,y,w,h) in faces : # 標記人臉
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2) #繪製矩形
#上兩句也可換成
#x, y, w, h = faces[0]
#cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2) 

cv2.imshow('cute boy',image)  # 顯示圖片

cv2.waitKey(0) # 等待用戶關閉圖片窗口
cv2.destroyAllWindows()# 關閉窗口

在這裏插入圖片描述

【 3. 繪製人臉區域中眼睛區域 】

進一步,我們在識別人臉的基礎上,使用官方提供的path-of-haarcascade_eye.xml人眼檢測模型,識別出人眼並繪製到圖片上。

  • 不好的效果
    如果單獨使用OpenCV人眼檢測模型,來識別出整個圖片中的人眼區域,效果不是很好。
import cv2
image = cv2.imread('picture.jpg')# 讀取圖片
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 轉換爲灰度圖片

face = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 人臉檢測器
faces = face.detectMultiScale(gray,1.1,3) # 識別人臉

for (x,y,w,h) in faces : # 繪製人臉區域
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0255),2) #繪製人臉矩形框

    eye_cascade = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_eye.xml')#人眼檢測器
    eyes = eye_cascade.detectMultiScale(gray) #識別人眼
    for (ex, ey, ew, eh) in eyes: #繪製人眼
        cv2.rectangle(image, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) # 繪製人眼矩形框

cv2.imshow('img',image)  # 顯示圖片
cv2.waitKey(0) # 等待用戶關閉圖片窗口
cv2.destroyAllWindows()# 關閉窗口

在這裏插入圖片描述綠色框區域爲眼睛,可以看出有識別錯誤的地方。

  • 好的效果

所以,一般情況下,我們會先檢測出人臉區域,然後在人臉區域中使用眼睛區域檢測模型得到眼睛區域,進而繪製。

import cv2
image = cv2.imread('picture.jpg')# 讀取圖片
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 轉換爲灰度圖片

face = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 人臉檢測器
faces = face.detectMultiScale(gray,1.1,3) # 識別人臉

for (x,y,w,h) in faces : # 繪製人臉區域
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2) #繪製人臉矩形框

    face_gray = gray[y:y + h, x:x + w] # 灰度圖片的臉部區域
    face_area = image[y:y + h, x:x + w] # 原圖像的臉部區域

    eye_cascade = cv2.CascadeClassifier(r'G:\Python32\Lib\site-packages\cv2\data\haarcascade_eye.xml')#人眼檢測器
    eyes = eye_cascade.detectMultiScale(face_gray) #識別人眼
    for (ex, ey, ew, eh) in eyes: #繪製人眼
        cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) # 繪製人眼矩形框

cv2.imshow('img',image)  # 顯示圖片
cv2.waitKey(0) # 等待用戶關閉圖片窗口
cv2.destroyAllWindows()# 關閉窗口

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章