天天看點

Python人臉檢測-基于opencv

一、介紹

OpenCV采用的是基于Haar的cascade分類器,它是一種機器學習方法。

基于Haar特征的cascade分類器是Paul Viola和 Michael Jone在2001年發表的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物品檢測方法。它是一種機器學習方法,通過許多正負樣例中訓練得到cascade模型,然後将其應用于其他圖檔。

二、函數

detectMultiScale()

參數:

1.image表示的是要檢測的輸入圖像

2.objects表示檢測到的人臉目标序列

3.scaleFactor表示每次圖像尺寸減小的比例

4. minNeighbors表示每一個目标至少要被檢測到3次才算是真的目标(因為周圍的像素和不同的視窗大小都可以檢測到人臉),

5.minSize為目标的最小尺寸

6.minSize為目标的最大尺寸

适當調整4,5,6兩個參數可以用來排除檢測結果中的幹擾項

三、步驟

1、初始化,導入cv2等Python庫,加載分類器cascade檔案;

2、圖檔預處理,讀取圖檔,使用cvtColor函數将圖檔轉為灰階圖;

3、人臉檢測,使用detectMultiScale方法檢測圖檔中的人臉。

cascade目錄位置查找

打開cmd,輸入pip show opencv-python

Python人臉檢測-基于opencv

打開目錄

Python人臉檢測-基于opencv

data目錄下是所有的分類器模型檔案

Python人臉檢測-基于opencv

程式示例

1、圖檔識别人臉

import numpy
import cv2

face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")

#讀取圖檔,使用cvtColor函數将圖檔轉為灰階圖
img = cv2.imread("all.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#檢測圖檔中的人臉
#faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces = face_cascade.detectMultiScale(gray)

#将人臉部分用長方形表示
print(faces)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)

#儲存結果
cv2.imwrite("result.jpg",img)
print("檢測完成,生成結果圖檔\n")

           
Python人臉檢測-基于opencv

識别結果

Python人臉檢測-基于opencv

2、攝像頭識别人臉

import cv2 as cv
import numpy as np

def face_detect(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier("lbpcascades/lbpcascade_frontalcatface.xml")
    faces = face_detector.detectMultiScale(gray, 1.02, 5)
    #faces = face_detector.detectMultiScale(gray)
    for x, y, w, h in faces:#給人臉添加矩形框
        cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
    return image


capture = cv.VideoCapture(0)#其中的0表示電腦中的第一個相機
cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
while (True):
    #按幀讀取視訊,ret,frame是獲cap.read()方法的兩個傳回值。其中ret是布爾值,如果讀取幀是正确的則傳回True,如果檔案讀取到結尾,它的傳回值就為False。frame就是每一幀的圖像,是個三維矩陣。
    ret, frame = capture.read()
    # cv.flip函數表示圖像翻轉,沿y軸翻轉, 0: 沿x軸翻轉, <0: x、y軸同時翻轉
    frame = cv.flip(frame, 1)
    frame = face_detect(frame)
    cv.imshow("result", frame)
    #waitKey()方法本身表示等待鍵盤輸入,參數是1,表示延時1ms切換到下一幀圖像,對于視訊而言;
    c = cv.waitKey(10)
    if c == 27:#當鍵盤按下‘ESC’退出程式
        break

#cv.waitKey(0)參數為0,如cv2.waitKey(0)隻顯示目前幀圖像,相當于視訊暫停,;
cv.waitKey(0)
cv.destroyAllWindows()#作用是能正常關閉繪圖視窗
           

總結

因為沒有設定參數,所有會有一些誤識别,還是識别到了所有人臉

繼續閱讀