当前位置: 首页 > 后端技术 > Python

基于Python的OpenCV人脸检测

时间:2023-03-26 15:15:42 Python

一、文章概览注:本文只是人脸检测。人脸识别的实现可以参考我的另一篇博客:基于OpenCV+TensorFlow+Keras的人脸识别本文将介绍如何在Python环境下使用OpenCV进行人脸检测。本文主要内容分为:1、检测图片中的人脸2、实时检测视频中的人脸3、使用设备的摄像头实时检测人脸2:准备工作事前准备:安装Python3下载并安装OpenCV库,方法是pipinstallopencv-python-ihttps://mirrors.aliyun.com/pypi/simple/--trusted-host=mirrors.aliyun.com/pypi/简单下载特征数据HAAR和LBP,两者都可以实现人脸特征的提取。HAAR多为小数计算,所以计算速度较慢,而LBP多为整数计算,运行速度较快。如图,本例使用红框内的文字,其他文字,比如第一个haarcascade_eye.xml是眼睛识别的文字,我们下次再用。注:点击下载HAAR和LBP的特征数据--------数据集下载3.开始讲述1.图像人脸检测(1)代码及说明`importcv2ascvimportnumpyasnpdefface_detect_demo():#人脸检测函数gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)#将图片转为灰度图,因为需要在灰度图中搜索人脸的特征#下面是HAAR和LBP特征数据,任意选一个注意:路径中的'/'和''是必须的#通过级联检测器加载特征数据cv.CascadeClassifier#face_detector=cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")face_detector=cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")#在尺度空间对图片进行人脸检测,第一个参数是哪张图片,第二个参数是向上或向下尺度变化,是的1.02倍原始规模。第三个参数是如果出现在相邻的几个人脸检测矩形框中,则识别为成人脸。这里它出现在5个相邻的人脸检测框中。如果画面模糊,建议调低一点。faces=face_detector.detectMultiScale(gray,1.02,5)forx,y,w,hinfaces:#Drawresultmap#rectangle参数说明,要绘制的目标图像,第一个矩形的顶点,对角线上的另一个顶点矩形,线条的颜色,线条的宽度cv.rectangle(src,(x,y),(x+w,y+h),(0,0,255),2)cv.imshow("result",src)#输出结果图src=cv.imread("D:/pyproject/cv_renlianjiance/cvrenxiangpic/1.jpg")#图片既是JPG又是PNGcv.namedWindow("inputimage",cv.WINDOW_AUTOSIZE)#创建绘图窗口cv.namedWindow("result",cv.WINDOW_AUTOSIZE)cv.imshow("inputimage",src)face_detect_demo()cv.waitKey(0)cv.destroyAllWindows()#作用是正常关闭绘图窗口`*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24(2)结果展示2.视频中的人脸检测(1)代码及说明`importcv2ascvimportnumpyasnpdefface_detect_demo(image):gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)#face_detector=cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")face_detector=cvier:/pyproject/复制代码cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")faces=face_detector.detectMultiScale(gray,1.02,5)forx,y,w,hinfaces:cv.rectangle(image,(x,y),(x+w,y)+h),(0,0,255),2)cv.imshow("结果",image)capture=cv.VideoCapture("D:/pyproject/cv_renlianjiance/video/1.mp4")cv.namedWindow("result",cv.WINDOW_AUTOSIZE)while(True):#逐帧读取视频,ret和frame是其中cap.read()方法的两个返回值其中ret是一个布尔值,如果读取到的帧是正确的,则返回True,如果文件读取到最后,则返回值为False。frame是每一帧的图像,是一个三维矩阵。ret,frame=capture.read()#cv.flip函数表示图像翻转,沿y轴翻转,0:沿x轴翻转,<0:同时沿x轴和y轴翻转frame=cv.flip(frame,1)face_detect_demo(frame)#waitKey()方法本身表示等待键盘输入,参数为1表示延迟1ms切换到下一帧图像,对于视频;c=cv.waitKey(10)ifc==27:#当按键盘'ESC'退出程序时break#cv.waitKey(0)参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停;cv.waitKey(0)cv.destroyAllWindows()#作用是正常关闭绘图窗口`*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29(2)结果显示3.使用设备上的摄像头进行人脸检测。其实和2中的代码是一样的,只是开启摄像头,而不是读取视频文件代码和描述importcv2ascvimportnumpyasnpdefface_detect_demo(image):gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)#face_detector=cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface.xml")face_detector=cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")faces=face_detector.detectMultiScale(gray,1.02,5)forx,y,w,hinfaces:cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)cv.imshow("result",image)capture=cv.VideoCapture(0)#其中0表示电脑中的第一个摄像头cv.namedWindow("result",cv.WINDOW_AUTOSIZE)while(True):#Readvideobyframe,ret,frame是cap.read()方法的两个返回值,其中ret是一个布尔值,如果读取到的帧正确,则返回True,如果文件读取到最后,它返回值为False。frame是每一帧的图像,是一个三维矩阵。ret,frame=capture.read()#cv.flip函数表示图像翻转,沿y轴翻转,0:沿x轴翻转,<0:同时沿x轴和y轴翻转frame=cv.flip(frame,1)face_detect_demo(frame)#waitKey()方法本身表示等待键盘输入,参数为1表示延迟1ms切换到下一帧图像,对于视频;c=cv.waitKey(10)ifc==27:#当按键盘'ESC'退出程序时break#cv.waitKey(0)参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停;cv.waitKey(0)cv.destroyAllWindows()#作用是正常关闭绘图窗口