
文章目錄
一、數據和知識准備
-
1. 下載HAAR與LBP數據
2. opencv相關知識
二、python+opencv實現人臉檢測
1. 圖像單人臉檢測
2. 圖像多人臉檢測
3. 視頻中人臉檢測
4. 攝像頭人臉檢測
一、數據和知識准備
1. 下載HAAR與LBP數據
人臉檢測的常見步驟如下,如果想要將人臉准確地檢測出來,需要通過建立人臉模型,獲取准確區分人臉的分類器,這里我們使用網上公開的擴展包或已經訓練好的分類器。
將haarcascades與lbpcascades里面的相關xml文件下載到本地,便於之后調用,輔助進行人臉檢測。
下載地址:https://github.com/opencv/opencv/tree/master/data

2. opencv相關知識
cv.CascadeClassifier():是OpenCV中人臉檢測的一個級聯分類器,既可以使用Haar特征,也可以使用LBP特征。以Haar特征分類器為基礎的對象檢測技術是一種非常有效的技術,它是基於機器學習且使用大量的正負樣本訓練得到分類器。
detectMultiScale函數:檢測人臉算法,其參數如下:
image:要檢測的輸入圖像
scaleFactor:表示每次圖像尺寸減小的比例
minNeighbors:表示每一個目標至少要被檢測到多少次才算是真的人臉,因為周圍的像素和不同的窗口大小都可能檢測成人臉
minSize:表示目標的最小尺寸
maxSize:表示目標的最小尺寸Haar-like矩形特征:是用於物體檢測的數字圖像特征。這類矩形特征模板由兩個或多個全等的黑白矩形相鄰組合而成,而矩形特征值是白色矩形的灰度值的和減去黑色矩形的灰度值的和,矩形特征對一些簡單的圖形結構,如線段、邊緣比較敏感。如果把這樣的矩形放在一個非人臉區域,那么計算出的特征值應該和人臉特征值不一樣,所以這些矩形就是為了把人臉特征量化,以區分人臉和非人臉。
LBP:是一種特征提取方式,能提取出圖像的局部的紋理特征,最開始的LBP算子是在3X3窗口中,取中心像素的像素值為閥值,與其周圍八個像素點的像素值比較,若像素點的像素值大於閥值,則此像素點被標記為1,否則標記為0。這樣就能得到一個八位二進制的碼,轉換為十進制即LBP碼,於是得到了這個窗口的LBP值,用這個值來反映這個窗口內的紋理信息。LBPH是在原始LBP上的一個改進,在opencv支持下可以直接調用函數直接創建一個LBPH人臉識別的模型。
比如:cv2.face.LBPHFaceRecognizer_create()。
二、python+opencv實現人臉檢測
1. 圖像單人臉檢測
import cv2 as cv def face_detection(image): # 創建一個級聯分類器 加載一個.xml分類器文件 它既可以是Haar特征也可以是LBP特征的分類器 face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml') # 多個尺度空間進行人臉檢測 返回檢測到的人臉區域坐標信息 faces = face_detecter.detectMultiScale(image=image, scaleFactor=1.1, minNeighbors=5) print('檢測人臉信息如下:\n', faces) for x, y, w, h in faces: # 在原圖像上繪制矩形標識 cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2) cv.imshow('result', image) src = cv.imread(r'./test/036.jpg') cv.imshow('input image', src) face_detection(src) cv.waitKey(0) cv.destroyAllWindows()
運行效果如下:
檢測人臉信息如下:
[[ 61 53 110 110]]
Process finished with exit code 0

2. 圖像多人臉檢測
import cv2 as cv
def face_detection(image):
# 轉成灰度圖像
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 創建一個級聯分類器 加載一個.xml分類器文件 它既可以是Haar特征也可以是LBP特征的分類器
face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
# 多個尺度空間進行人臉檢測 返回檢測到的人臉區域坐標信息
faces = face_detecter.detectMultiScale(image=gray, scaleFactor=1.1, minNeighbors=5)
print('檢測人臉信息如下:\n', faces)
for x, y, w, h in faces:
# 在原圖像上繪制矩形標識
cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
cv.imshow('result', image)
src = cv.imread(r'./test/044.jpg')
cv.imshow('input image', src)
face_detection(src)
cv.waitKey(0)
cv.destroyAllWindows()
運行效果如下:
檢測人臉信息如下:
[[329 157 49 49]
[ 88 156 44 44]
[157 158 54 54]
[240 159 50 50]
[ 86 370 68 68]
[ 79 254 54 54]
[339 250 58 58]
[155 254 59 59]
[251 247 59 59]
[199 371 80 80]
[308 370 69 69]]
Process finished with exit code 0

3. 視頻中人臉檢測
import cv2
# 加載視頻
cap = cv2.VideoCapture('test.mp4')
# 創建一個級聯分類器 加載一個.xml分類器文件 它既可以是Haar特征也可以是LBP特征的分類器
face_detect = cv2.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
while True:
# 讀取視頻片段
ret, frame = cap.read()
if not ret: # 讀完視頻后falg返回False
break
frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
# 灰度處理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 多個尺度空間進行人臉檢測 返回檢測到的人臉區域坐標信息
face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=8)
# 繪制矩形和圓形檢測人臉
for x, y, w, h in face_zone:
cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
cv2.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
# 顯示圖片
cv2.imshow('video', frame)
# 設置退出鍵和展示頻率
if ord('q') == cv2.waitKey(40):
break
# 釋放資源
cv2.destroyAllWindows()
cap.release()
截取新版倚天屠龍記某一集36:35到36:39的片段,簡單實現實時檢測人臉並顯示,運行效果如下:



任何算法都不會100%識別准確,由於噪聲、誤差、算法、訓練集等影響,某些時候也會出現一些錯誤識別。自己進行簡單測試時也會發現,人物動作、視頻中鏡頭切換過快、背景變化等因素,可能會造成對視頻中人臉檢測不准確。
4. 攝像頭人臉檢測
import cv2 as cv
# 識別電腦攝像頭並打開
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
# 創建一個級聯分類器 加載一個.xml分類器文件 它既可以是Haar特征也可以是LBP特征的分類器
face_detect = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
while True:
# 讀取視頻片段
flag, frame = cap.read()
frame = cv.flip(frame, 1)
if not flag: # 讀完視頻后falg返回False
break
# 灰度處理
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 多個尺度空間進行人臉檢測 返回檢測到的人臉區域坐標信息
face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 繪制矩形和圓形檢測人臉
for x, y, w, h in face_zone:
cv.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
cv.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
# 顯示圖片
cv.imshow('video', frame)
# 設置退出鍵q 展示頻率
if ord('q') == cv.waitKey(30):
break
# 釋放資源
cv.destroyAllWindows()
cap.release()
程序運行,即可調用電腦的攝像頭識別面對攝像頭的人臉,正臉和靜止狀態檢測人臉的效果好。

- END -
歡迎關注公眾號:Python爬蟲數據分析挖掘,方便及時閱讀最新文章
記錄學習python的點點滴滴;
回復【開源源碼】免費獲取更多開源項目源碼;

