基于OpenCV的简单人脸识别系统
生活随笔
收集整理的這篇文章主要介紹了
基于OpenCV的简单人脸识别系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
-
- 1. 調用庫函數
- 2. 調用攝像頭并設置窗口
- 3. 設置圖片正負樣本數據集的路徑
- 4. 調用人臉檢測器
- 5. 正負樣本載入
- 6.提取人臉區域
- 7. 建立LBPH人臉識別模型
- 8. 實時檢測
- 9. 測試結果
- 10. 不足之處
- 11. 改進方法
聲明:本程序基于Python的OpenCV模塊編程,利用opencv已有的人臉檢測器和人臉識別器進行實時人臉識別
?
1. 調用庫函數
import cv2 import numpy as np- 1
- 2
2. 調用攝像頭并設置窗口
frameWidth = 640 frameHeight = 480 cap = cv2.VideoCapture(0) cap.set(3, frameWidth) #設置參數,10為亮度 cap.set(4, frameHeight) cap.set(10,150)- 1
- 2
- 3
- 4
- 5
- 6
3. 設置圖片正負樣本數據集的路徑
pos_path = './resource/face_detect/video2imagem3/' neg_path = './resource/face_detect/video2imagec1/' test_path = './resource/face/' images = [] labels = []- 1
- 2
- 3
- 4
- 5
4. 調用人臉檢測器
注:人臉識別器在安裝opencv庫的時候就一塊安裝了,在opencv的安裝路徑下可以找到。
faceCascade = cv2.CascadeClassifier("resource/haarcascade_frontalface_default.xml")- 1
5. 正負樣本載入
由于本數據集人臉數據是通過程序處理視頻獲得的,因此,便于批量導入程序中。
正樣本(人臉)與負樣本(環境)比例大致為1:3,據說這樣比例效果較好;標簽為0,1。
導入語句如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
6.提取人臉區域
這里對于沒檢測到人臉區域的圖片不進行處理,對于人臉區域,將其周圍20像素左右部分提取出來
def processing(imageslist):for j in range(len(imageslist)):faces = faceCascade.detectMultiScale(imageslist[j], 1.1, 4)for x,y,w,h in faces:if x >= 20 and y >= 20: # 未處理沒檢測到人臉的情況imageslist[j] = imageslist[j][y-20:y+h+20, x-20:x+w+20]return imageslist- 1
- 2
- 3
- 4
- 5
- 6
- 7
7. 建立LBPH人臉識別模型
這里采用LBPH人臉識別模塊,因為這種方法不需要圖片數據集為統一尺寸,EigenFaces和Fisherfaces模塊均需要訓練集圖片和測試的圖片尺寸保持一致。
imagesCopy = images # 提取圖像中人臉的區域 imagesCopy = processing(imagesCopy) recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.train(imagesCopy, np.array(labels))- 1
- 2
- 3
- 4
- 5
8. 實時檢測
人臉檢測中,如果未檢測到人臉,則face返回的是空元組,檢測到人臉后,提取出人臉區域,采用recognizer.predict進行識別,對于返回值的confidence,小于50認為結果可靠,而大于80則認為差別較大。
while True:success,img = cap.read()predict_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face = faceCascade.detectMultiScale(predict_image, 1.1, 4)# print(face) # 空的元組有可能if face != ():for x, y, w, h in face:if x >= 20 and y >= 20:faceArea = predict_image[y-20:y+h+20, x-20:x+w+20]cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 1)label, confidence = recognizer.predict(faceArea)if confidence <= 80 and label == 0:cv2.putText(img, "LQL",(x, y-20), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0,1))print("YOU ARE LQL")else:cv2.putText(img, "OTHERS", (x, y-20), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0),1)print("OTHERS")print(confidence)print(label)else:cv2.putText(img, "None", (320, 240), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 255), 1)print("None")cv2.imshow("img", img)if cv2.waitKey(1) & 0xFF == ord('q'):break- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
9. 測試結果
能夠基本實現特定人臉識別的功能。
10. 不足之處
總之,目前只是實現了一個簡單的實時人臉識別功能,后續有時間再改進。
11. 改進方法
總結
以上是生活随笔為你收集整理的基于OpenCV的简单人脸识别系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建军多少年 纪念中国人民解放军建军周年?
- 下一篇: 为什么说神经网络可以逼近任意函数?