本文实例为大家分享了python利用Opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下
首先:需要在在自己本地安装opencv具体步骤可以问度娘
如果从事于开发中的话建议用第三方的人脸识别(推荐阿里)
1、视频流中进行人脸识别
# -*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(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 while cap.isOpened(): ok, frame = cap.read() # 读取一帧数据 if not ok: break # 将当前帧转换成灰度图像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数 faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) if len(faceRects) > 0: # 大于0则检测到人脸 count=count+1 return count if __name__ == '__main__': result=CatchUsbVideo("识别人脸区域", '2222.mp4') if result>0: print('视频中有人!!') else: print('视频中无人!!')
2、通过图片识别人脸
#-*-coding:utf8-*-# import os import cv2 from PIL import Image,ImageDraw from datetime import datetime import time #detectFaces()返回图像中所有人脸的矩形坐标(矩形左上、右下顶点) #使用haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades目录下还有其他的训练好的xml文件可供选择。 #注:haarcascades目录下训练好的分类器必须以灰度图作为输入。 def detectFaces(image_name): img = cv2.imread(image_name) face_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml") if img.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) in faces: result.append((x,y,x+width,y+height)) return result #保存人脸图 def saveFaces(image_name): faces = detectFaces(image_name) if faces: #将人脸保存在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) in faces: 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也一样。 def drawFaces(image_name): faces = detectFaces(image_name) if faces: img = Image.open(image_name) draw_instance = ImageDraw.Draw(img) for (x1,y1,x2,y2) in faces: draw_instance.rectangle((x1,y1,x2,y2), outline=(255, 0,0)) img.save('drawfaces_'+image_name) #检测眼睛,返回坐标 #由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detectEyes可在detectFaces基础上来进行,代码中需要注意“相对坐标”。 #当然也可以在整张图片上直接使用分类器,这种方法代码跟detectFaces一样,这里不多说。 def detectEyes(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) in faces: roi_gray = gray[y1:y2, x1:x2] eyes = eye_cascade.detectMultiScale(roi_gray,1.3,2) for (ex,ey,ew,eh) in eyes: result.append((x1+ex,y1+ey,x1+ex+ew,y1+ey+eh)) return result #在原图像上框出眼睛. def drawEyes(image_name): eyes = detectEyes(image_name) if eyes: img = Image.open(image_name) draw_instance = ImageDraw.Draw(img) for (x1,y1,x2,y2) in eyes: draw_instance.rectangle((x1,y1,x2,y2), outline=(0, 0,255)) img.save('draweyes_'+image_name) #检测笑脸 def detectSmiles(image_name): img = cv2.imread(image_name) smiles_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_smile.xml") if img.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) in smiles: result.append((x,y,x+width,y+height)) return result #在原图像上框出笑脸 def drawSmiles(image_name): smiles = detectSmiles(image_name) if smiles: img = Image.open(image_name) draw_instance = ImageDraw.Draw(img) for (x1,y1,x2,y2) in smiles: 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)) if len(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里面也有画矩形的模块,同样可以用来框出人脸。 """
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“python利用Opencv实现人脸识别功能”评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2025年04月26日
2025年04月26日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]