1. 程式人生 > 程式設計 >python基於opencv實現人臉識別

python基於opencv實現人臉識別

將opencv中haarcascade_frontalface_default.xml檔案下載到本地,我們呼叫它輔助進行人臉識別。

識別影象中的人臉

#coding:utf-8
import cv2 as cv

# 讀取原始影象
img = cv.imread('face.png')

# 呼叫熟悉的人臉分類器 識別特徵型別
# 人臉 - haarcascade_frontalface_default.xml
# 人眼 - haarcascade_eye.xml
# 微笑 - haarcascade_smile.xml
face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

# 檢查人臉 按照1.1倍放到 周圍最小畫素為5
face_zone = face_detect.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5)
print ('識別人臉的資訊:',face_zone)

# 繪製矩形和圓形檢測人臉
for x,y,w,h in face_zone:
  # 繪製矩形人臉區域 thickness表示線的粗細
  cv.rectangle(img,pt1=(x,y),pt2=(x+w,y+h),color=[0,255],thickness=2)
  # 繪製圓形人臉區域 radius表示半徑
  cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,255,0],thickness=2)

# 設定圖片可以手動調節大小
cv.namedWindow("Easmount-CSDN",0)

# 顯示圖片
cv.imshow("Easmount-CSDN",img)

# 等待顯示 設定任意鍵退出程式
cv.waitKey(0)
cv.destroyAllWindows()

python基於opencv實現人臉識別

注意,此演算法只能檢測正臉,並且任何演算法都有一定的準確率。如上圖所示,影象中有一處被錯誤地檢測為人臉。

CascadeClassifier:

是OpenCV中人臉檢測的一個級聯分類器,既可以使用Haar,也可以使用LBP特徵。以Haar特徵分類器為基礎的物件檢測技術是一種非常有效的技術。它是基於機器學習且使用大量的正負樣本訓練得到分類器。

Haar-like矩形特徵:

是用於物體檢測的數字影象特徵。這類矩形特徵模板由兩個或多個全等的黑白矩形相鄰組合而成,而矩形特徵值是白色矩形的灰度值的和減去黑色矩形的灰度值的和,矩形特徵對一些簡單的圖形結構,如線段、邊緣比較敏感。如果把這樣的矩形放在一個非人臉區域,那麼計算出的特徵值應該和人臉特徵值不一樣,所以這些矩形就是為了把人臉特徵量化,以區分人臉和非人臉。

LBP:

是一種特徵提取方式,能提取出影象的區域性的紋理特徵,最開始的LBP運算元是在3X3視窗中,取中心畫素的畫素值為閥值,與其周圍八個畫素點的畫素值比較,若畫素點的畫素值大於閥值,則此畫素點被標記為1,否則標記為0。這樣就能得到一個八位二進位制的碼,轉換為十進位制即LBP碼,於是得到了這個視窗的LBP值,用這個值來反映這個視窗內的紋理資訊。LBPH是在原始LBP上的一個改進,在opencv支援下我們可以直接呼叫函式直接建立一個LBPH人臉識別的模型。比如:cv.face.LBPHFaceRecognizer_create()。

detectMultiScale:

檢測人臉演算法,其引數:
– image表示要檢測的輸入影象

– objects表示檢測到的人臉目標序列
– scaleFactor表示每次影象尺寸減小的比例
– minNeighbors表示每一個目標至少要被檢測到3次才算是真的目標,因為周圍的畫素和不同的視窗大小都可以檢測到人臉
– minSize表示目標的最小尺寸
– maxSize表示目標的最大尺寸

識別視訊中的人臉

將視訊中每一幀影象取出,進行影象人臉識別,標記識別到的人臉,顯示每一幀影象。

#coding:utf-8
import cv2 as cv
import numpy as np

# 載入視訊
cap = cv.VideoCapture('wang.mp4')

# 呼叫熟悉的人臉分類器 識別特徵型別
# 人臉 - haarcascade_frontalface_default.xml
# 人眼 - haarcascade_eye.xm
# 微笑 - haarcascade_smile.xml
face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')

while True:
  # 讀取視訊片段
  flag,frame = cap.read()
  if flag == False:
    break

  # 灰度處理
  gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)

  # 檢查人臉 按照1.1倍放到 周圍最小畫素為5
  face_zone = face_detect.detectMultiScale(gray,scaleFactor = 1.5,minNeighbors = 8)

  # 繪製矩形和圓形檢測人臉
  for x,h in face_zone:
    cv.rectangle(frame,pt1 = (x,pt2 = (x+w,color = [0,thickness=2)
    cv.circle(frame,center = (x + w//2,y + h//2),radius = w//2,thickness = 2)

  # 顯示圖片
  cv.imshow('video',frame)
  
  # 設定退出鍵和展示頻率
  if ord('q') == cv.waitKey(25):
    break

# 釋放資源
cv.destroyAllWindows()
cap.release()

python基於opencv實現人臉識別

識別攝像頭中的人臉

#coding:utf-8
import cv2 as cv

# 識別電腦攝像頭並開啟
cap = cv.VideoCapture(0)

# 呼叫熟悉的人臉分類器 識別特徵型別
# 人臉 - haarcascade_frontalface_default.xml
# 人眼 - haarcascade_eye.xm
# 微笑 - haarcascade_smile.xml
face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')

while True:
  # 讀取視訊片段
  flag,code=cv.COLOR_BGR2GRAY)

  # 檢查人臉 按照1.1倍放到 周圍最小畫素為5
  face_zone = face_detect.detectMultiScale(gray,scaleFactor = 1.1,minNeighbors = 5)

  # 繪製矩形和圓形檢測人臉
  for x,frame)
  
  # 設定退出鍵和展示頻率
  if ord('q') == cv.waitKey(40):
    break

# 釋放資源
cv.destroyAllWindows()
cap.release()

以上就是python基於opencv實現人臉識別的詳細內容,更多關於python opencv 人臉識別的資料請關注我們其它相關文章!