博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Python的OpenCV人脸检测
阅读量:4139 次
发布时间:2019-05-25

本文共 4016 字,大约阅读时间需要 13 分钟。

一、文章概述

注意:本文只是人脸检测,人脸识别的实现请参见本人另一篇博客:

本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:

1、检测图片中的人脸

2、实时检测视频中出现的人脸
3、用运设备的摄像头实时检测人脸

二:准备工作

提前做的准备:

  • 安装好Python3
  • 下载安装OpenCV库,方法是pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com/pypi/simple
  • 下载特征数据HAAR和LBP,这两种数据都能实现对人脸特征的提取,HAAR大多是小数计算所以运算速度较慢,LBP大多是整数计算运行速度较快。如图所示,本次实例用红框中的文本,其他的文本,比如第一个haarcascade_eye.xml是眼睛识别的文本,我们下次再用。
    注意:点击下载HAAR和LBP的特征数据--------
  • 在这里插入图片描述

三、开始讲述

1、图片人脸检测

(1)代码和说明

import cv2 as cvimport numpy as np

def face_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)
for x, y, w, h in faces:#绘制结果图
#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和png都可以

cv.namedWindow(“input image”, cv.WINDOW_AUTOSIZE)#创建绘图窗口
cv.namedWindow(“result”, cv.WINDOW_AUTOSIZE)
cv.imshow(“input image”, 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)代码和说明

import cv2 as cvimport numpy as np

def face_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 = cv.CascadeClassifier(“D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml”)
faces = face_detector.detectMultiScale(gray, 1.02, 5)
for x, y, w, h in faces:
cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv.imshow(“result”, 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)
if c == 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中的代码一样,只是打开摄像头,而不是读取视频文件

代码和说明

import cv2 as cvimport numpy as np

def face_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 = cv.CascadeClassifier(“D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml”)
faces = face_detector.detectMultiScale(gray, 1.02, 5)
for x, y, w, h in faces:
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):
#按帧读取视频,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)
if c == 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

以上就是本文所有内容,希望能帮到大家!!!

转载地址:http://bvlvi.baihongyu.com/

你可能感兴趣的文章
If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>
hdu 3787 hdoj 3787
查看>>
hdu 3790 hdoj 3790
查看>>
hdu 3789 hdoj 3789
查看>>
hdu 3788 hdoj 3788
查看>>
zju 1003 zoj 1003
查看>>
zju 1004 zoj 1004
查看>>
zju 1005 zoj 1005
查看>>
zju 1006 zoj 1006
查看>>
【虚拟机】虚拟化架构与系统部署(Windows系统安装)
查看>>
字节跳动安卓开发实习生面试分享
查看>>
好书分享之——《能力陷进》
查看>>
阅读笔记《c++ primer》
查看>>
阅读笔记《C++标准程序库》
查看>>
基于mirror driver的windows屏幕录像
查看>>
C语言8
查看>>