OpenCV---人臉檢測


 一:相關依賴文件下載

https://github.com/opencv/opencv

  

 二:實現步驟(圖片檢測)

(一)讀取圖片

image= cv.imread("./d.png")  #讀取圖片

 (二)灰度轉換

gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #在灰度圖像基礎上實現的

(三)獲取人臉識別訓練數據

face_detector = cv.CascadeClassifier("./haarcascade_frontalface_alt_tree.xml")  #級聯檢測器獲取文件

這個xml文件,就是opencv在GitHub上共享出來的具有普適的訓練好的數據。我們可以直接的拿來使用

(四)探測人臉,獲取相關數據

faces = face_detector.detectMultiScale(gray,1.1,2)
#第一個參數是灰度圖像
#第二個參數是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍
#第三個參數是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要適當降低

 (五)根據相關數據在原圖像上畫出人臉位置

    for x,y,w,h in faces:
        cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("face_detection",image)

(六)全部代碼

import cv2 as cv
import numpy as np

def face_detect_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #在灰度圖像基礎上實現的
    face_detector = cv.CascadeClassifier("./haarcascade_frontalface_alt_tree.xml")  #級聯檢測器獲取文件
    faces = face_detector.detectMultiScale(gray,1.1,2)    #在多個尺度空間上進行人臉檢測
    #第一個參數是灰度圖像
    #第二個參數是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍
    #第三個參數是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要試單降低
    for x,y,w,h in faces:
        cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("face_detection",image)



src = cv.imread("./d.png")  #讀取圖片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #創建GUI窗口,形式為自適應
cv.imshow("input image",src)    #通過名字將圖像和窗口聯系

face_detect_demo(src)

cv.waitKey(0)   #等待用戶操作,里面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作
cv.destroyAllWindows()  #銷毀所有窗口

三:實現視頻檢測人臉

步驟相同,我們只需要將視頻中每一幀圖像進行處理,調用上面的圖像人臉檢測即可

import cv2 as cv
import numpy as np

def face_detect_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #在灰度圖像基礎上實現的
    face_detector = cv.CascadeClassifier("./haarcascade_frontalface_default.xml")  #級聯檢測器獲取文件
    faces = face_detector.detectMultiScale(gray,1.1,2)    #在多個尺度空間上進行人臉檢測
    #第一個參數是灰度圖像
    #第二個參數是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍
    #第三個參數是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要試單降低
    for x,y,w,h in faces:
        cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
    cv.imshow("face_detection",image)

def video_face_detect():
    capture = cv.VideoCapture(0)
    while True:
        ret,frame = capture.read()  #frame是每一幀圖像,ret是返回值,為0是表示圖像讀取完畢
        frame = cv.flip(frame,1)
        if ret == False:
            break
        face_detect_demo(frame)
        c = cv.waitKey(10)
        if c == 27:
            break

video_face_detect()

cv.waitKey(0)   #等待用戶操作,里面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作
cv.destroyAllWindows()  #銷毀所有窗口

相關知識補充

(一)CascadeClassifier級聯分類器

是Opencv中做人臉檢測的時候的一個級聯分類器
有兩種選擇:一是使用老版本的CvHaarClassifierCascade函數,一是使用新版本的CascadeClassifier類。
老版本的分類器只支持類Haar特征,而新版本的分類器既可以使用Haar,也可以使用LBP特征。

基本原理

xml中存放的是訓練后的特征池,特征size大小根據訓練時的參數而定,檢測的時候可以簡單理解為就是將每個固定size特征(檢測窗口)與輸入圖像的同樣大小區域比較,如果匹配那么就記錄這個矩形區域的位置,然后滑動窗口,檢測圖像的另一個區域,重復操作。
由於輸入的圖像中特征大小不定,比如在輸入圖像中眼睛是50x50的區域,而訓練時的是25x25,那么只有當輸入圖像縮小到一半的時候,才能匹配上,所以這里還有一個逐步縮小圖像,也就是制作圖像金字塔的流程。
cascPath = "./haarcascade_frontalface_default.xml"
cv2.CascadeClassifier(cascPath)  #構造方法加載入xml特征文件

detectMultiScale方法

faces = faceCascade.detectMultiScale(gray,1.1,2,30)
def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None): # real signature unknown; restored from __doc__
#第一個參數image:是灰度圖像
#第二個參數scaleFactor:是尺度變換,就是向上或者向下每次是原來的多少倍,這里是1.02倍
#第三個參數minNeighbors:是人臉檢測次數,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要適當降低
#第四個參數flags:
  CASCADE_DO_CANNY_PRUNING=1, 利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區域
  CASCADE_SCALE_IMAGE=2, 正常比例檢測 CASCADE_FIND_BIGGEST_OBJECT=4, 只檢測最大的物體
  CASCADE_DO_ROUGH_SEARCH=8 初略的檢測
#最后兩個參數用來限制得到的目標區域的范圍

注意:

flags對於新的分類器沒有用

 設置minNeighbors:是在人臉附近進行指定次數的檢測,獲取最准確的范圍,設置越高,誤檢率越低,但是對於迷糊圖片,我們設置越高,越不易檢測出來,要適當降低

 


免責聲明!

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



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