#人脸检测和识别
#将haarcascades文件夹中所有文件辅助到cascades文件夹中
#使用OpenCV进行人脸检测
#静态图像中的人脸检测
import cv2
filename = './path/to/my/pic.jpg'
def detect(filename):
#创建CascadeClassifier对象
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)
detect(filename)
#视频中的人脸检测
#对人脸绘制蓝色的矩形框,对眼睛绘制绿色的矩形框
import cv2
def detect():
#创建检测人脸和眼睛的CascadeClassifier对象
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
camero = 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))
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
#显示这一帧图像的检测结果
cv2.imshow("cemera",frame)
#输入q退出
if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
break
camera.release()
cv2.destroyALLWindows()
if __name__ == "__main__":
detect()
#人脸识别
#生成人脸识别数据
#将摄像头捕获到的图像进行人脸检测,然后获得人脸区域,将人脸区域保存下来,作为数据
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)
#r人脸检测
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/jm/%s.pgm'% str(count),f)
count += 1
cv2.imshow("carema",frame)
#输入q退出
if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
break
camera.release()
cv2.destroyALLWindows()
if __name__ == "__main__":
genetate()
#加载数据并识别人脸
def read_images(path,sz=None):
c = 0 #每一个文件夹中的所有的图像都是属于同一个人,不同文件夹内的图像属于不同人
X,y = [],[]
# 返回的是一个三元组(root,dirs,files)
#root 所指的是当前正在遍历的这个文件夹的本身的地址
#dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
#files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
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)
im = cv2.imread(filename,cv2.IMREAD_GRAYSCALE)
if (sz is not None):
im = cv2.resize(im,(200,200))
X.append(np.asarray(im,dtype=np.uint8))
y.append(c)
except IOError,(errno,strerror):
print( "I/O error({0}):{1}".format(errno,strerror))
except:
print("Unexpected error:",sys.exc_info()[0])
raise
c = c + 1
return [X,y]
#基于Eigenfaces的人脸识别
def face_rec():
names = ['Joe','Jane','Jack']
#获得数据集
[X,y] = read_image(sys.argv[1]) #path
y = np.asarray(y,dtype=np.int32)
#获得模型
model = cv2.face.createEigenFaceRecognizer()
#训练模型
model.train(np.asarray(X),np.asarray(y))
#使用摄像头捕获图像进行验证
camera = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
while (True):
read,img = camera.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
img = cv2.ranctangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi = gray[y:y+h,x:x+w]
#识别人脸
try:
roi = cv2.resize(roi,(200,200),interpolation=cv2.INTER_LINEAR)
params = model.predict(roi)
print("Label : %s,Confidencce: %.2f" % (params[0],params[1]))
#将识别的人名写在人脸边框左上角上面
cv2.putText(img,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
expect:
continue
cv2.imshow("camera",img)
if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
break
cv2.destroyALLWindows()
#基于Fisherfaces的人脸识别
model = cv2.face.createFisherFaceRecognizer()
#基于LBPH的人脸识别
#函数参数:radius、neighbors、grib_x、grib_y以及置信度阈值
#默认值:1,8,8,8,123.0
model = cv2.face.createLBPHFaceRecognizer()