6-9 Haar+adaboost人臉識別


我們重點分析了Haar特征的概念以及如何計算Haar特征,並介紹了Haar+Adaboost分類器它們的組合以及Adaboost分類器如何使用和訓練。這節課我們將通過代碼來實現一下Haar+Adaboost分類器實現的人臉識別。

計算jpg圖片的haar特征,不過這一步opencv已經幫我們做了,所以我們不需要。我們只需要對這個圖片進行一個灰度處理,因為所有的haar特征必須要是基於灰度圖片來進行計算的。第四步,我們進行檢測。所以我們要檢測出來當前的haar特征的人臉以及人臉上的眼睛。總共有兩個XML文件,其中一個XML文件描述的是人臉,另外一個XML文件描述的是眼睛。第五步,我們需要對檢測出來的結果進行遍歷,並且繪制一下我們檢測出來的方框。比如說我把眼睛繪制出來,並且把臉同樣使用一個方框給大家標注出來。

第一步引入XML文件。D:\opencv-3.4.1\opencv-3.4.1\data\haarcascades\haarcascade_eye.xml.眼睛識別的訓練好的Adaboost分類器。D:\opencv-3.4.1\opencv-3.4.1\data\haarcascades\haarcascade_frontalface_default.xml.已經訓練好的人臉識別的分類器。同時加載進來我們眼睛識別的XML文件。

第二步load當前的jpg.

第三步計算haar特征。因為這個計算的過程我們已經交給了opencv,所以這一步我們就可以跳過。我們只需要把它轉化成一個灰度圖像。灰度轉化我們已經接觸過了。我們需要把BGR圖片轉化成灰度圖片。

第四步detect檢測。cv2中有一個方法可以完成人臉識別的檢測。這個方法的作用它主要是為了檢測出圖片中的人臉。我們在講解haar特征的時候知道,圖片的haar特征除了模板從上到下,從左到右地滑動之外,每一個模板還要進行一個比例縮放。所以這里有一個比例縮放的概念。第三個參數是我們的目標大小。比如說我們的人臉最小不能小於5個像素。所以這里還有一個5這個概念。我們想獲取一下當前總共有多少張人臉,len(faces)檢測一下當前人臉的個數。

第五步繪制一下當前每一個人臉,給每一個人臉畫一個方框。既然是要畫方框,那么我們就需要知道這個方框的xy寬高信息。我們使用for循環的形式來進行遍歷。

這個demo不光是想實現人臉識別,同樣還想實現人眼睛識別。

 

# 1 load xml 2 load jpg 3 haar gray 4 detect 5 draw
import cv2
import numpy as np
# load xml 1 file name
face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')
# load jpg
img = cv2.imread('face.jpg')
cv2.imshow('src',img)
# haar gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# detect faces 1 data 2 scale 3 5 
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face=',len(faces))
# draw
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_face = gray[y:y+h,x:x+w]
    roi_color = img[y:y+h,x:x+w]
    # 1 gray
    eyes = eye_xml.detectMultiScale(roi_face)
    print('eye=',len(eyes))
    for (e_x,e_y,e_w,e_h) in eyes:
        cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)
cv2.imshow('dst',img)
cv2.waitKey(0)

# 1 load xml 2 load jpg 3 haar gray 4 detect 5 draw
import cv2
import numpy as np
# load xml 1 file name
face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')
# load jpg
img = cv2.imread('face1.jpg')
cv2.imshow('src',img)
# haar gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# detect faces 1 data 2 scale 3 5 
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face=',len(faces))
# draw
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_face = gray[y:y+h,x:x+w]
    roi_color = img[y:y+h,x:x+w]
    # 1 gray
    eyes = eye_xml.detectMultiScale(roi_face)
    print('eye=',len(eyes))
    for (e_x,e_y,e_w,e_h) in eyes:
        cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)
cv2.imshow('dst',img)
cv2.waitKey(0)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM