網(wǎng)站后臺用什么做優(yōu)化流程
1 人臉檢測介紹
1.1 什么是人臉檢測
人臉檢測的目標是確定圖像或視頻中是否存在人臉。如果存在多個面,則每個面都被一個邊界框包圍,因此我們知道這些面的位置
人臉檢測算法的主要目標是準確有效地確定圖像或視頻中人臉的存在和位置。這些算法分析數(shù)據(jù)的視覺內(nèi)容,搜索與面部特征相對應的模式和特征。通過采用機器學習、圖像處理和模式識別等各種技術,人臉檢測算法旨在將人臉與視覺數(shù)據(jù)中的其他對象或背景元素區(qū)分開來。
人臉很難建模,因為有許多變量可以改變,例如面部表情、方向、照明條件以及太陽鏡、圍巾、口罩等部分遮擋。檢測結(jié)果給出了面部位置參數(shù),并且可以要求有多種形式,例如覆蓋面部中央部分、眼睛中心或包括眼睛、鼻子和嘴角、眉毛、鼻孔等的標志的矩形。
1.2 Haar級聯(lián)分類器
人臉檢測是計算機視覺中的一個重要任務,在現(xiàn)實生活中有著廣泛的應用價值。Haar級聯(lián)分類器是OpenCV中實現(xiàn)人臉檢測其中一種算法,它通過分析相鄰圖像區(qū)域之間的對比度,確定給定圖像或子圖像是否與已知類型匹配。我們來考慮如何在層次結(jié)構(gòu)中組合多個Haar級聯(lián)分類器,以便用一個分類器識別父區(qū)域(就目標而言是一張人臉),用其他分類器識別子區(qū)域(比如眼睛)。在OpenCV源代碼的副本中會有一個文件夾data/haarcascades。該文件夾包含了所有OpenCV的人臉檢測的XML文件,這些文件可用于檢測靜止圖像、視頻和攝像頭所得到圖像中的人臉。
從文件名可知這些級聯(lián)是用于人臉、眼睛、鼻子和嘴的跟蹤。這些文件需要正面、直立的人臉圖像。創(chuàng)建人臉檢測器時會使用這些文件,創(chuàng)建自己的級聯(lián),并訓練這些級聯(lián)來檢測各種對象。
代碼地址:https://github.com/opencv/opencv/tree/4.x/data/haarcascades
2 使用opencv進行人臉檢測
在靜態(tài)圖像或視頻中檢測人臉的操作非常相似。視頻人臉檢測只是從攝像頭讀出每幀圖像,然后采用靜態(tài)圖像中的人臉檢測方法進行檢測。當然,視頻人臉檢測還涉及其他的概念,例如跟蹤,而靜態(tài)圖像中的人臉檢測就沒有這樣的概念,但它們的基本理論是一致的。
2.1 靜態(tài)圖像人臉檢測
檢測步驟為讀取靜態(tài)圖像,調(diào)用模型進行檢測。
在OpenCV中,人臉檢測使用的是cv2.CascadeClassifier.detectMultiScale()函數(shù),它可以檢測出圖片中所有的人臉。
cv2.detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
參數(shù):image: 輸入圖像, 灰度圖;
scaleFactor: 圖像尺寸縮小比例, 決定兩個不同大小的窗口掃描之間有多大的跳躍;
minNeighbors: 被檢測到幾次才算目標;
minSize: 目標最小尺寸;
maxSize: 目標最大尺寸;
人臉檢測代碼:
import cv2image = cv2.imread('../data/girl01.jpg')
# 獲取XML文件,加載人臉檢測器
faceCascade = cv2.CascadeClassifier('../data/haarcascade_frontalface_default.xml')# 色彩轉(zhuǎn)換,轉(zhuǎn)換為灰度圖像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 調(diào)用函數(shù)detectMultiScale
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5))
print(faces)
print("發(fā)現(xiàn){0}個人臉!".format(len(faces)))
# 逐個標注人臉
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+w), (0, 255, 0), 2)cv2.imshow("face", image)
cv2.imwrite("../data/detect_result.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
檢測結(jié)果如下:
[[242 115 159 159]]
發(fā)現(xiàn)1個人臉!
?
人眼檢測代碼:
2.2 視頻人臉檢測
檢測步驟為讀取視頻的每一幀圖像,對每一幀圖像逐一進行人臉檢測
import cv2# 1.讀取視頻
cv2.namedWindow("CaptureFace")
cap = cv2.VideoCapture('../data/girl.mp4')# 2.人臉識別器分類器
classfier = cv2.CascadeClassifier('../data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)while cap.isOpened():flag, frame = cap.read()frame = cv2.flip(frame, 1) # 鏡像操作if not flag:break# 3.灰度轉(zhuǎn)換grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 4.人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數(shù)facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(facerects) > 0: # 大于0則檢測到人臉for faceRect in facerects: # 單獨框出每一張人臉x, y, w, h = faceRect# 5.畫圖cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)cv2.imshow("CaptureFace", frame)if cv2.waitKey(10) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
運行結(jié)果顯示如下:
2.3 攝像頭人臉檢測
檢測步驟為打開攝像頭,捕獲攝像頭的每一幀數(shù)據(jù),針對每一幀數(shù)據(jù)進行檢測
import cv2# 1.調(diào)用攝像頭
cv2.namedWindow("CaptureFace")
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)# 2.人臉識別器分類器
classfier = cv2.CascadeClassifier('../data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)while cap.isOpened():flag, frame = cap.read()frame = cv2.flip(frame, 1) # 鏡像操作if not flag:break# 3.灰度轉(zhuǎn)換grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 4.人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數(shù)facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(facerects) > 0: # 大于0則檢測到人臉print('檢測到人臉')for faceRect in facerects: # 單獨框出每一張人臉x, y, w, h = faceRect# 5.畫圖cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)cv2.imshow("CaptureFace", frame)if cv2.waitKey(10) & 0xFF == ord('q'):break
檢測到人臉
檢測到人臉
檢測到人臉
檢測到人臉
檢測到人臉
檢測到人臉