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,0,255], thickness=2) # 繪制圓形人臉區域 radius表示半徑 cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2) # 設置圖片可以手動調節大小 cv.namedWindow("Easmount-CSDN", 0) # 顯示圖片 cv.imshow("Easmount-CSDN", img) # 等待顯示 設置任意鍵退出程序 cv.waitKey(0) cv.destroyAllWindows()
註意,此算法隻能檢測正臉,並且任何算法都有一定的準確率。如上圖所示,圖像中有一處被錯誤地檢測為人臉。
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, y, w, h in face_zone: cv.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2) cv.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 顯示圖片 cv.imshow('video', frame) # 設置退出鍵和展示頻率 if ord('q') == cv.waitKey(25): break # 釋放資源 cv.destroyAllWindows() cap.release()
識別攝像頭中的人臉
#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, frame = cap.read() if flag == False: break # 灰度處理 gray = cv.cvtColor(frame, code=cv.COLOR_BGR2GRAY) # 檢查人臉 按照1.1倍放到 周圍最小像素為5 face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.1, minNeighbors = 5) # 繪制矩形和圓形檢測人臉 for x, y, w, h in face_zone: cv.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2) cv.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 顯示圖片 cv.imshow('video', frame) # 設置退出鍵和展示頻率 if ord('q') == cv.waitKey(40): break # 釋放資源 cv.destroyAllWindows() cap.release()
以上就是python基於opencv實現人臉識別的詳細內容,更多關於python opencv 人臉識別的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 基於python3+OpenCV實現人臉和眼睛識別
- 超詳細註釋之OpenCV Haar級聯檢測器進行面部檢測
- opencv基於Haar人臉檢測和眼睛檢測
- python 使用OpenCV進行簡單的人像分割與合成
- Python OpenCV機器學習之圖像識別詳解