Python环境使用OpenCV检测人脸实现教程


Posted in Python onOctober 19, 2020

一、文章概述

本文将要讲述的是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是眼睛识别的文本,我们下次再用。

(1)代码和说明

import cv2 as cv
import 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()#作用是能正常关闭绘图窗口

(2)结果展示

Python环境使用OpenCV检测人脸实现教程

2、视频中的人脸检测

(1)代码和说明

import cv2 as cv
import 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()#作用是能正常关闭绘图窗口

(2)结果展示

Python环境使用OpenCV检测人脸实现教程

3、利用设备上的摄像头进行人脸检测,其实和2中的代码一样,只是打开摄像头,而不是读取视频文件

代码和说明

import cv2 as cv
import 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()#作用是能正常关闭绘图窗口

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Python人脸识别初探
Dec 21 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
详解django的serializer序列化model几种方法
Oct 16 Python
对python:print打印时加u的含义详解
Dec 15 Python
python模块如何查看
Jun 16 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
pandas统计重复值次数的方法实现
Feb 20 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
python面向对象版学生信息管理系统
Jun 24 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 Python
python Tornado框架的使用示例
Oct 19 #Python
python mock测试的示例
Oct 19 #Python
python 提高开发效率的5个小技巧
Oct 19 #Python
python 利用toapi库自动生成api
Oct 19 #Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 #Python
python爬取音频下载的示例代码
Oct 19 #Python
Python爬虫教程知识点总结
Oct 19 #Python
You might like
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
Jquery获取radio选中值实例总结
2019/01/17 jQuery
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python有序字典简单实现方法示例
2017/09/28 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
自动化职业生涯规划书范文
2014/01/03 职场文书
市场营销工作计划书
2014/05/06 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
让生命充满爱观后感
2015/06/08 职场文书
庆七一主持词
2015/06/29 职场文书
人力资源部工作计划
2019/05/14 职场文书