1. 程式人生 > >基於OpenCV的人臉識別/人臉檢測

基於OpenCV的人臉識別/人臉檢測

1:簡介
人臉檢測指從現實環境中識別出人臉的位置

人臉識別基於人臉檢測,下一步才能辨析人臉的屬性,從而判別這個人是誰。

2:影象基本概念
:一張圖
幀數:一秒鐘重新整理多少張圖片
解析度:單位大小所能承載的畫素,能力為正相關
影象插值:提高影象解析度
OpenCV提供了5種插值方法:最鄰近雙線性、基於畫素區域、立方插值及蘭索斯插值(加粗的兩個時間複雜度低)
介紹:引用 影象插值
灰度圖二值影象的拓展,在黑白兩種顏色中取得灰色,黑,白,灰
人臉ROI
3:應用
Haar級聯來做人臉檢測。 Haar級聯通過在多個尺度上從影象中提取大量的簡單特徵來實現。
簡單特徵主要指邊、線、矩形特徵等,這些特徵都非常易於計算,
然後通過建立一系列簡單的分類器來做訓練。

這裡需要一個cascade_files去訓練model,完整程式碼見我的github

https://github.com/shaojintian/Face_detection/tree/master

#face_nose&eyes_detection.py
import cv2
import numpy as np

#import Haar files to train face detection model 

face_cascade=cv2.CascadeClassifier('cascade_files/haarcascade_frontalface_alt.xml')
nose_cascade=
cv2.CascadeClassifier('cascade_files/haarcascade_mcs_nose.xml') eye_cascade=cv2.CascadeClassifier('cascade_files/haarcascade_eye.xml') # check whether haar is done if face_cascade.empty(): raise IOError('Unable to load haarcascade_frontalface_alt') if nose_cascade.empty(): raise IOError('Unable to load haarcascade_mcs_nose.xml'
) if eye_cascade.empty(): raise IOError('Unable to load haarcascade_eye.xml') # initialize camera from PC camera # parameter 0 -> PC camera camera=cv2.VideoCapture(0) #image clearity scale scale_image=0.6 # infinite circle to capture images while True: #capture current image #frame->幀 ret,frame=camera.read() #每次都調整一下幀的大小 #interpolation(插值法):最近鄰時間複雜度最小 frame=cv2.resize(frame,None,fx=scale_image,fy=scale_image, interpolation=cv2.INTER_NEAREST) #將影象轉為灰度圖 gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #灰度影象上執行人臉檢測器->人臉矩形框 #1.5->乘積係數,5->最小緊鄰數量 face_rects=face_cascade.detectMultiScale(gray,1.5,5) #畫出人臉矩形框 #nose ,eyes in face_rects #3->框的厚度 for(x,y,w,h) in face_rects: cv2.rectangle(frame,(x,y),(x+w,y+h),(255,128,0),2) #require face ROI information roi_gray=gray[y:y+h,x:x+w] roi_color=frame[y:y+h,x:x+w] eye_rects=eye_cascade.detectMultiScale(roi_gray) nose_rects=nose_cascade.detectMultiScale(roi_gray) #draw eye and nose rectangle for(x_eye,y_eye,w_eye,h_eye) in eye_rects: center=(int(x_eye+0.5*w_eye),int(y_eye+0.5*h_eye)) radius=int(0.3*(w_eye+h_eye)) color=(0,255,255) thickness=2 cv2.circle(roi_color,center,radius,color,thickness) for(x_nose,y_nose,w_nose,h_nose) in nose_rects: center=(int(x_nose+0.5*w_nose),int(y_nose+0.5*h_nose)) radius=int(0.3*(w_nose+h_nose)) color=(0,255,255) thickness=2 cv2.circle(roi_color,center,radius,color,thickness) break #顯示幀 cv2.namedWindow('SJT_cam',0)#0->auto size window cv2.imshow('SJT_cam',frame) # 通過esc退出 #wait 1ms to check key response key=cv2.waitKey(1) if key==27:#27==ESC break; #釋放攝像頭 camera.release() #關閉所有窗體 cv2.destroyAllWindows()