1. 程式人生 > 其它 >python基於opencv庫的人臉識別總結

python基於opencv庫的人臉識別總結

一、基本過程

1人臉檢測

2影象獲取

3模型訓練(包含人臉特徵值)

4讀取模型進行人臉識別

二、人臉檢測

參考連結(https://www.cnblogs.com/zyly/p/9410563.html

2-1、人臉檢測必備基礎知識

2-1-1基本原理:(1)知識類:主要把人臉看作器官組合,根據器官的相對幾何位置關係來識別人臉和取特徵值(2)統計方法(演算法)將人臉看作一個整體的模式——二維畫素矩陣,從統計的觀點通過大量人臉影象樣本構造人臉模式空間,根據相似度量來判斷人臉是否存在。主要包括主成分分析與特徵臉、神經網路方法、支援向量機、隱馬爾可夫模型、Adaboost演算法等。 //學長的my_UI的人臉識別基於支援向量機演算法我自己找的基於Adaboost演算法

2-1-2哈爾特徵值精簡理解版: 邊緣、線性、中心、對角線的特徵值組成特徵模板(特徵模板的特徵值為白色畫素和減去黑色畫素和)//當定位到人臉的識別點之後根據特徵模板取特徵值

//2-1-3級聯分類器:從上面所述內容我們可以總結Haar分類器訓練的五大步驟:1、準備人臉、非人臉樣本集;2、計算特徵值和積分圖;3、篩選出T個優秀的特徵值(即最優弱分類器);4、把這個T個最優弱分類器傳給AdaBoost進行訓練。5、級聯,也就是強分類器的強強聯手。

2-1-3xml檔案opencv自帶了訓練器和檢測器也可以自己訓練分類器來識別其他的haarcascades、lbpcascades 分別是基於不同的特徵取特徵值

2-2視訊中的人臉檢測

#2、視訊中的人臉檢測
def DynamicDetect():
'''
開啟攝像頭,讀取幀,檢測幀中的人臉,掃描檢測到的人臉中的眼睛,對人臉繪製藍色的矩形框,對人眼繪製綠色的矩形框
'''
#建立一個級聯分類器 載入一個 .xml 分類器檔案. 它既可以是Haar特徵也可以是LBP特徵的分類器.
#匯入python的opencv自帶的訓練器,若出bug可以改為絕對路徑
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')

#開啟攝像頭
camera = cv2.VideoCapture(0)
#0表示攝像頭的id,當調取網路攝像頭時id要換為url
cv2.namedWindow('Dynamic')#給視訊窗體取名字

while(True):
#讀取一幀影象
ret,frame = camera.read()
#判斷圖片讀取成功?
if ret:
gray_img = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#轉為灰度影象
#人臉檢測
faces = face_cascade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in faces:
#在原影象上繪製矩形
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray_img[y:y+h,x:x+w]
#眼睛檢測
eyes = eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(frame,(ex+x,ey+y),(x+ex+ew,y+ey+eh),(0,255,0),2)

cv2.imshow('Dynamic',frame)
#如果按下q鍵則退出
if cv2.waitKey(100) & 0xff == ord('q') :
break

camera.release()
cv2.destroyAllWindows()

對detectMultiScale函式的解析

detectMultiScale(image[,scaleFactor[,minNeighbors[,flags[,minSize[,maxSize]]]]])
  • image:表示的是要檢測的輸入影象

  • scaleFactor:為每一個影象尺度中的尺度引數,預設值為1.1。scaleFactor引數可以決定兩個不同大小的視窗掃描之間有多大的跳躍,這個引數設定的大,則意味著計算會變快,但如果視窗錯過了某個大小的人臉,則可能丟失物體。

  • minNeighbors:引數為每一個級聯矩形應該保留的鄰近個數,預設為3。minNeighbors控制著誤檢測,預設值為3表明至少有3次重疊檢測,我們才認為人臉確實存。

  • flags:對於新的分類器沒有用(但目前的haar分類器都是舊版的,CV_HAAR_DO_CANNY_PRUNING,這個值告訴分類器跳過平滑(無邊緣區域)。利用Canny邊緣檢測器來排除一些邊緣很少或者很多的影象區域;CV_HAAR_SCALE_IMAGE,這個值告訴分類器不要縮放分類器。而是縮放影象(處理好記憶體和快取的使用問題,這可以提高效能。)就是按比例正常檢測;CV_HAAR_FIND_BIGGEST_OBJECTS,告訴分類器只返回最大的目標(這樣返回的物體個數只可能是0或1)只檢測最大的物,CV_HAAR_DO_ROUGH_SEARCH,他只可與CV_HAAR_FIND_BIGGEST_OBJECTS一起使用,這個標誌告訴分類器在任何視窗,只要第一個候選者被發現則結束尋找(當然需要足夠的相鄰的區域來說明真正找到了。),只做初略檢測.

  • minSize:為目標的最小尺寸

  • maxSize:為目標的最大尺寸