人脸识别案例:【实战】opencv人脸检测+Haar特征分类器
1 基礎
我們使用機器學習的方法完成人臉檢測,首先需要大量的正樣本圖像(面部圖像)和負樣本圖像(不含面部的圖像)來訓練分類器。我們需要從其中提取特征。下圖中的 Haar 特征會被使用,就像我們的卷積核,每一個特征是一 個值,這個值等于黑色矩形中的像素值之后減去白色矩形中的像素值之和。
Haar特征值反映了圖像的灰度變化情況。例如:臉部的一些特征能由矩形特征簡單的描述,眼睛要比臉頰顏色要深,鼻梁兩側比鼻梁顏色要深,嘴巴比周圍顏色要深等。
Haar特征可用于于圖像任意位置,大小也可以任意改變,所以矩形特征值是矩形模版類別、矩形位置和矩形大小這三個因素的函數。故類別、大小和位置的變化,使得很小的檢測窗口含有非常多的矩形特征。
得到圖像的特征后,訓練一個決策樹構建的adaboost級聯決策器來識別是否為人臉。
2.實現
OpenCV中自帶已訓練好的檢測器,包括面部,眼睛,貓臉等,都保存在XML文件中,我們可以通過以下程序找到他們:
import cv2 as cv print(cv.__file__)找到的文件如下所示:
那我們就利用這些文件來識別人臉,眼睛等。檢測流程如下:
讀取圖片,并轉換成灰度圖
實例化人臉和眼睛檢測的分類器對象
# 實例化級聯分類器 classifier =cv.CascadeClassifier( "haarcascade_frontalface_default.xml" ) # 加載分類器 classifier.load('haarcascade_frontalface_default.xml')進行人臉和眼睛的檢測
rect = classifier.detectMultiScale(gray, scaleFactor, minNeighbors, minSize,maxsize)參數:
-
Gray: 要進行檢測的人臉圖像
-
scaleFactor: 前后兩次掃描中,搜索窗口的比例系數
-
minneighbors:目標至少被檢測到minNeighbors次才會被認為是目標
-
minsize和maxsize: 目標的最小尺寸和最大尺寸
將檢測結果繪制出來就可以了。
主程序如下所示:
import cv2 as cv import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False# 1.以灰度圖的形式讀取圖片 img = cv.imread("img/tly.jpg") gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)# 2. 實例化OpenCV人臉和眼睛識別的分類器 # 2.1 實例化級聯分類器 face_cas = cv.CascadeClassifier( "C:\\ProgramData\\Anaconda3\\envs\\py37\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml" ) # 2.1 加載分類器 face_cas.load('C:\\ProgramData\\Anaconda3\\envs\\py37\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml') # 2.2 實例化級聯分類器 eyes_cas = cv.CascadeClassifier("C:\\ProgramData\\Anaconda3\\envs\\py37\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml") # 2.2 加載分類器 eyes_cas.load("C:\\ProgramData\\Anaconda3\\envs\\py37\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")# 3.調用識別人臉 """rect = classifier.detectMultiScale(gray, scaleFactor, minNeighbors, minSize,maxsize) Gray: 要進行檢測的人臉圖像scaleFactor: 前后兩次掃描中,搜索窗口的比例系數minneighbors:目標至少被檢測到minNeighbors次才會被認為是目標minsize和maxsize: 目標的最小尺寸和最大尺寸 """ faceRects = face_cas.detectMultiScale(gray=gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) for faceRect in faceRects:x, y, w, h = faceRect# 框出人臉cv.rectangle(img, (x, y), (x + h, y + w),(0,255,0), 3)# 4.在識別出的人臉中進行眼睛的檢測roi_color = img[y:y+h, x:x+w]roi_gray = gray[y:y+h, x:x+w]eyes = eyes_cas.detectMultiScale(roi_gray)for (ex,ey,ew,eh) in eyes:cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) # 5. 檢測結果的繪制 plt.figure(figsize=(8,6),dpi=100) plt.imshow(img[:,:,::-1]),plt.title('檢測結果') plt.xticks([]), plt.yticks([]) plt.show()結果:
此處報錯:
cv2.error: OpenCV(3.4.5) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’
解決方案:
【在虛擬環境下完美解決】1698: error: (-215:Assertion failed) empty() in function cv::CascadeClassifier_李大狗的讀研日記-CSDN博客https://blog.csdn.net/qq_39237205/article/details/122085915https://blog.csdn.net/qq_39237205/article/details/122085915
我們也可在視頻中對人臉進行檢測:
import cv2 as cv
import matplotlib.pyplot as plt
# 1.讀取視頻
cap = cv.VideoCapture("movie.mp4")
# 2.在每一幀數據中進行人臉識別
while(cap.isOpened()):ret, frame = cap.read()if ret==True:gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 3.實例化OpenCV人臉識別的分類器 face_cas = cv.CascadeClassifier( "haarcascade_frontalface_default.xml" ) face_cas.load('haarcascade_frontalface_default.xml')# 4.調用識別人臉 faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) for faceRect in faceRects: x, y, w, h = faceRect # 框出人臉 cv.rectangle(frame, (x, y), (x + h, y + w),(0,255,0), 3) cv.imshow("frame",frame)if cv.waitKey(1) & 0xFF == ord('q'):break
# 5. 釋放資源
cap.release() ?
cv.destroyAllWindows()
總結
opencv中人臉識別的流程是:
讀取圖片,并轉換成灰度圖
實例化人臉和眼睛檢測的分類器對象
進行人臉和眼睛的檢測
將檢測結果繪制出來就可以了。
我們也可以在視頻中進行人臉識別
總結
以上是生活随笔為你收集整理的人脸识别案例:【实战】opencv人脸检测+Haar特征分类器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pytorch神经网络实战案例】04
- 下一篇: 【Pytorch神经网络基础理论篇】 0