轉載來自https://blog.csdn.net/retacn_yue/article/details/53608388
第五章 人臉檢測和識別
1 haar級聯的概念
2 獲取haar級聯數據
在opencv源碼中data/haarcascades目錄下存放了用於人臉檢測的xml文件.用於檢測靜止圖像,視頻和攝像頭中的人臉
用於人臉眼睛 鼻子和嘴的跟蹤
haarcascade_profileface
haarcascade_smile
haarcascade_russian_plate_number
haarcascade_upperbody
haarcascade_righteye_2splits
3 使用opencv進行人臉檢測
3.1 靜態圖像中的人臉檢測
示例代碼如下:
import cv2
filename=’../zz.jpg’
def detect(filename):
#用於人臉檢測xml
face_cascade=cv2.CascadeClassifier(‘../cascades/haarcascade_frontalface_default.xml’)
#讀入圖像
img=cv2.imread(filename)
#更換顏色空間
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces=face_cascade.detectMultiScale(gray,
1.3,#圖像的壓縮率
5)#人臉矩形保留鄰近數目的最小值
#在原始圖像上繪製藍色矩形
for (x,y,w,h) in faces:
img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.namedWindow('Vikings Detected!!')
cv2.imshow("Vikings Detected!!",img)
cv2.imwrite('../vikings.jpg',img)
cv2.waitKey(0)
if name==’main‘:
detect(filename)
執行結果:老同桌的臉居然識別不出來
3.2 視頻中的人臉檢測
示例代碼如下:
!/usr/bin/env python
-- coding: utf-8 --
@Time : 2016/12/3 13:36
@Author : Retacn
@Site : 視頻中的人臉檢測
@File : fact_detection_video.py
@Software: PyCharm
author = “retacn”
copyright = “property of mankind.”
license = “CN”
version = “0.0.1”
maintainer = “retacn”
email = “[email protected]”
status = “Development”
import cv2
def detect():
# 加載haar級聯文件
face_cascade = cv2.CascadeClassifier(‘../cascades/haarcascade_frontalface_default.xml’)
eye_cascade = cv2.CascadeClassifier(‘../cascades/haarcascade_eye.xml’)
camera = cv2.VideoCapture(0)
# 捕獲視頻幀
while (True):
ret, frame = camera.read()
# 轉換顏色空間
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
#繪製檢測到的人臉矩形
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
# roi_gray = gray[y:y + h, x:x + w]
#檢測眼睛
# eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40))
eyes = eye_cascade.detectMultiScale(img, 1.03, 5, 0, (40, 40))
#繪製檢測到的眼睛矩形
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
#print(x,y,w,h,ex,ey,ew,eh)
#顯示圖像
cv2.imshow('Camers', frame)
#按q鍵退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
camera.release()
cv2.destroyAllWindows()
if name == ‘main‘:
detect()
3.3 人臉視別
人臉數據庫:
The yale facedatabase
http://version.ucsd.edu/content/yale-face-database
The AT&T
http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
The extendedyale or yale b
http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
A 生成人臉數據
生成圖像角本
圖像像是灰度格式的.pgm文件,形狀爲正方式,大小要一樣
示例代碼如下:
!/usr/bin/env python
-- coding: utf-8 --
@Time : 2016/12/3 15:14
@Author : Retacn
@Site : 生成人臉識別數據
@File : createData.py
@Software: PyCharm
author = “retacn”
copyright = “property of mankind.”
license = “CN”
version = “0.0.1”
maintainer = “retacn”
email = “[email protected]”
status = “Development”
import cv2
def generate():
face_cascade = cv2.CascadeClassifier(‘../cascades/haarcascade_frontalface_default.xml’)
eye_cascade = cv2.CascadeClassifier(‘../cascades/haarcascade_eye.xml’)
camera = cv2.VideoCapture(0)
count = 0
while (True):
ret, frame = camera.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
cv2.imwrite('../data/at/retacn/%s.pgm' % str(count), f)
count += 1
cv2.imshow("Camera", frame)
if cv2.waitKey(33) & 0xFF == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
if name == ‘main‘:
generate()
B 人臉視別
C 準備訓練數據
生成csv文件的方法,示例代碼如下:
!/usr/bin/env python
-- coding: utf-8 --
@Time : 2016/12/3 15:14
@Author : Retacn
@Site : 生成人臉識別數據
@File : createData.py
@Software: PyCharm
author = “retacn”
copyright = “property of mankind.”
license = “CN”
version = “0.0.1”
maintainer = “retacn”
email = “[email protected]”
status = “Development”
import cv2
def generate():
face_cascade = cv2.CascadeClassifier(‘../cascades/haarcascade_frontalface_default.xml’)
eye_cascade = cv2.CascadeClassifier(‘../cascades/haarcascade_eye.xml’)
camera = cv2.VideoCapture(0)
count = 0
while (True):
ret, frame = camera.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
cv2.imwrite('../data/at/retacn/%s.pgm' % str(count), f)
count += 1
cv2.imshow("Camera", frame)
if cv2.waitKey(33) & 0xFF == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
if name == ‘main‘:
generate()
D 加載數據並識別人臉
示例代碼如下:
加載識別數據
def read_image(path, sz=None):
c = 0
x, y = [], []
for dirname, dirnames, filenames in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
for filename in os.listdir(subject_path):
try:
if (filename == ‘.directory’):
continue
filepath = os.path.join(subject_path, filename)
img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
if (sz is not None):
im = cv2.resize(im, (200, 200))
x.append(np.asanyarray(im, dtype=np.uint8))
y.append(c)
except IOError as ioe:
print(ioe)
except:
print(‘Unexpected error:’, sys.exc_info()[0])
raise
c += 1
return [x, y]
E 基於eignfaces的人臉識別
示例代碼如下:
!/usr/bin/env python
-- coding: utf-8 --
@Time : 2016/12/3 22:07
@Author : Retacn
@Site : TODO 需要重新編譯opencv擴展包,人臉檢測與識別
@File : face_detection.py
@Software: PyCharm
author = “retacn”
copyright = “property of mankind.”
license = “CN”
version = “0.0.1”
maintainer = “retacn”
email = “[email protected]”
status = “Development”
import cv2
import numpy as np
import sys
import os.path
生成人臉識別數據
def generate():
face_cascade = cv2.CascadeClassifier(‘../data/cascades/haarcascade_frontalface_default.xml’)
eye_cascade = cv2.CascadeClassifier(‘../data/cascades/haarcascade_eye.xml’)
# 讀取攝像頭視頻數據
camera = cv2.VideoCapture(0)
count = 0
while (True):
ret, frame = camera.read()
# 更換顏色空間
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
cv2.imwrite('../data/at/retacn/%s.pgm' % str(count), f)
count += 1
cv2.imshow("Camera", frame)
if cv2.waitKey(1000 / 12) & 0xFF == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
加載識別數據
def read_image(path, sz=(200, 200)):
c = 0
x, y = [], []
for dirname, dirnames, filenames in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
for filename in os.listdir(subject_path):
try:
if (filename == ‘.directory’):
continue
filepath = os.path.join(subject_path, filename)
img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
if (sz is not None):
img = cv2.resize(img, (200, 200))
x.append(np.asarray(img, dtype=np.uint8))
y.append(c)
except IOError as ioe:
print(ioe)
except:
print(‘Unexpected error:’, sys.exc_info()[0])
raise
c += 1
return [x, y]
基於eigenfaces的人臉識別
def face_rec():
names = [‘Yue’, ‘Retacn’, ‘Three’]
# 需要輸入樣本數據的存放路徑
if len(sys.argv) < 2:
print(‘USAGE: facerec_defo.py [/path/to/store/images/at]’)
sys.exit()
# 讀入圖像數組,第二個參數爲樣本圖像的存放位置
[x, y] = read_image(sys.argv[1])
y = np.asarray(y, dtype=np.int32)
# [x, y] = read_image(‘D:/workspace_pycharm/opencv3_python/data/at’)
# 如果有三個參數,則將第三個參數設爲輸出目錄
if len(sys.argv) == 3:
out_dir = sys.argv[2]
# 創建人臉識別模型
# model = cv2.face.createEigenFaceRecognizer()
# 基於Fisherfaces的人臉識別
# model = cv2.face.createFisherFaceRecognizer()
# 基於lbph的人臉識別
model = cv2.face.createLBPHFaceRecognizer()
model.train(np.asarray(x), np.asarray(y))
camera = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('../data/cascades/haarcascade_frontalface_default.xml')
while (True):
read, img = camera.read()
faces = face_cascade.detectMultiScale(img, 1.3, 5)
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
roi = gray[x:x + w, y:y + h]
try:
roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)
# roi = cv2.resize(gray, (200, 200), interpolation=cv2.INTER_LINEAR)
# 置信度評分
params = model.predict(roi)
print(params)
print('Lable:%s,Confidence:%02f' % (params[0], params[1]))
cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
except:
continue
cv2.imshow("camera", img)
if cv2.waitKey(33) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
if name == ‘main‘:
# generate()
# [X, y] = read_image(‘D:/workspace_pycharm/opencv3_python/data/at’)
face_rec()
# generate()
F 基於fisherfaces的人臉識別
基於Fisherfaces的人臉識別
#model=cv2.face.createFisherFaceRecognizer()
G 基於LBPH的人臉識別
基於lbph的人臉識別
model=cv2.face.createLBPHFaceRecognizer()
H 通過置信度評分來丟棄結果
Predict()