日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于OpenCV的简单人脸识别系统

發布時間:2024/9/20 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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。
導入語句如下:

for i in range(60): # 正樣本images.append(cv2.imread(pos_path+str(2*(i+1))+'.jpg',cv2.IMREAD_GRAYSCALE))labels.append(0)for i in range(173): # 負樣本images.append(cv2.imread(neg_path+str(2*(i+1))+'.jpg',cv2.IMREAD_GRAYSCALE))labels.append(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. 不足之處

  • 未將訓練部分與檢測部分分開,導致每次都要重新訓練,消耗一定的時間,目前只做了一種人臉識別;–已解決
  • 由于數據是從視頻中導出的圖片,因此對于訓練集中可能存在的未檢測到人臉的情況也未作處理;
  • 沒有將所有的圖片尺寸resize為統一尺寸,因此只能用LBPH模塊進行人臉識別,不過,在另一方面,用cv2.resize可能會存在畫面比例失衡的問題,損失訓練效果;
  • 另外,對于負樣本,只用了背景圖片,后續可以試試物體之類的。
    總之,目前只是實現了一個簡單的實時人臉識別功能,后續有時間再改進。
  • 11. 改進方法

  • 下列語句可以對訓練好的模型進行保存和讀取,因此可以將訓練部分與識別部分分隔開
  • recognizer = cv2.face.LBPHFaceRecognizer_create()recognizer.save('./resource/face_detect/MyFaceModel.xml') recognizer.read('./resource/face_detect/MyFaceModel.xml')

    總結

    以上是生活随笔為你收集整理的基于OpenCV的简单人脸识别系统的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。