python利用Opencv实现人脸识别功能
本文实例为大家分享了python利用Opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下
首先:需要在在自己本地安装opencv具体步骤可以问度娘
如果从事于开发中的话建议用第三方的人脸识别(推荐阿里)
1、视频流中进行人脸识别
#-*-coding:utf-8-*-
importcv2
importsys
fromPILimportImage
defCatchUsbVideo(window_name,camera_idx):
cv2.namedWindow(window_name)
#视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
cap=cv2.VideoCapture(camera_idx)
#告诉OpenCV使用人脸识别分类器
classfier=cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml")
#识别出人脸后要画的边框的颜色,RGB格式
color=(0,255,0)
count=0
whilecap.isOpened():
ok,frame=cap.read()#读取一帧数据
ifnotok:
break
#将当前帧转换成灰度图像
grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
faceRects=classfier.detectMultiScale(grey,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))
iflen(faceRects)>0:#大于0则检测到人脸
count=count+1
returncount
if__name__=='__main__':
result=CatchUsbVideo("识别人脸区域",'2222.mp4')
ifresult>0:
print('视频中有人!!')
else:
print('视频中无人!!')
2、通过图片识别人脸
#-*-coding:utf8-*-#
importos
importcv2
fromPILimportImage,ImageDraw
fromdatetimeimportdatetime
importtime
#detectFaces()返回图像中所有人脸的矩形坐标(矩形左上、右下顶点)
#使用haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades目录下还有其他的训练好的xml文件可供选择。
#注:haarcascades目录下训练好的分类器必须以灰度图作为输入。
defdetectFaces(image_name):
img=cv2.imread(image_name)
face_cascade=cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml")
ifimg.ndim==3:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
else:
gray=img#if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图
faces=face_cascade.detectMultiScale(gray,1.2,5)#1.3和5是特征的最小、最大检测窗口,它改变检测结果也会改变
result=[]
for(x,y,width,height)infaces:
result.append((x,y,x+width,y+height))
returnresult
#保存人脸图
defsaveFaces(image_name):
faces=detectFaces(image_name)
iffaces:
#将人脸保存在save_dir目录下。
#Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是detectFaces返回的坐标),save保存。
save_dir=image_name.split('.')[0]+"_faces"
os.mkdir(save_dir)
count=0
for(x1,y1,x2,y2)infaces:
file_name=os.path.join(save_dir,str(count)+".jpg")
Image.open(image_name).crop((x1,y1,x2,y2)).save(file_name)
count+=1
#在原图像上画矩形,框出所有人脸。
#调用Image模块的draw方法,Image.open获取图像句柄,ImageDraw.Draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即
#detectFaces返回的坐标),outline是矩形线条颜色(B,G,R)。
#注:原始图像如果是灰度图,则去掉outline,因为灰度图没有RGB可言。drawEyes、detectSmiles也一样。
defdrawFaces(image_name):
faces=detectFaces(image_name)
iffaces:
img=Image.open(image_name)
draw_instance=ImageDraw.Draw(img)
for(x1,y1,x2,y2)infaces:
draw_instance.rectangle((x1,y1,x2,y2),outline=(255,0,0))
img.save('drawfaces_'+image_name)
#检测眼睛,返回坐标
#由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detectEyes可在detectFaces基础上来进行,代码中需要注意“相对坐标”。
#当然也可以在整张图片上直接使用分类器,这种方法代码跟detectFaces一样,这里不多说。
defdetectEyes(image_name):
eye_cascade=cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml')
faces=detectFaces(image_name)
img=cv2.imread(image_name)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
result=[]
for(x1,y1,x2,y2)infaces:
roi_gray=gray[y1:y2,x1:x2]
eyes=eye_cascade.detectMultiScale(roi_gray,1.3,2)
for(ex,ey,ew,eh)ineyes:
result.append((x1+ex,y1+ey,x1+ex+ew,y1+ey+eh))
returnresult
#在原图像上框出眼睛.
defdrawEyes(image_name):
eyes=detectEyes(image_name)
ifeyes:
img=Image.open(image_name)
draw_instance=ImageDraw.Draw(img)
for(x1,y1,x2,y2)ineyes:
draw_instance.rectangle((x1,y1,x2,y2),outline=(0,0,255))
img.save('draweyes_'+image_name)
#检测笑脸
defdetectSmiles(image_name):
img=cv2.imread(image_name)
smiles_cascade=cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_smile.xml")
ifimg.ndim==3:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
else:
gray=img#if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图
smiles=smiles_cascade.detectMultiScale(gray,4,5)
result=[]
for(x,y,width,height)insmiles:
result.append((x,y,x+width,y+height))
returnresult
#在原图像上框出笑脸
defdrawSmiles(image_name):
smiles=detectSmiles(image_name)
ifsmiles:
img=Image.open(image_name)
draw_instance=ImageDraw.Draw(img)
for(x1,y1,x2,y2)insmiles:
draw_instance.rectangle((x1,y1,x2,y2),outline=(100,100,0))
img.save('drawsmiles_'+image_name)
if__name__=='__main__':
time1=datetime.now()
result=detectFaces('9.jpg')
time2=datetime.now()
print("耗时:"+str(time2-time1))
iflen(result)>0:
print("有人存在!!---》人数为:"+str(len(result)))
else:
print('视频图像中无人!!')
drawFaces('9.jpg')
#drawEyes('obama.jpg')
#drawSmiles('obama.jpg')
#saveFaces('obama.jpg')
"""
上面的代码将眼睛、人脸、笑脸在不同的图像上框出,如果需要在同一张图像上框出,改一下代码就可以了。
总之,利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。剪切保存人脸以及用矩形工具框出人脸,本程序使用的是PIL里的Image、ImageDraw模块。
此外,opencv里面也有画矩形的模块,同样可以用来框出人脸。
"""
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。