精简 opencv python_基于Python的OpenCV人脸检测!简直不要太简单!

一、文章概述

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

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

2、实时检测视频中出现的人脸

3、用运设备的摄像头实时检测人脸

二:准备工作

提前做的准备:安装好Python3

下载特征数据HAAR和LBP,这两种数据都能实现对人脸特征的提取,HAAR大多是小数计算所以运算速度较慢,LBP大多是整数计算运行速度较快。如图所示,本次实例用红框中的文本,其他的文本,比如第一个haarcascade_eye.xml是眼睛识别的文本,我们下次再用。

注意:点击下载HAAR和LBP的特征数据--------数据集下载

三、开始讲述

1、图片人脸检测

(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)结果展示

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)结果展示

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

此文转载,著作权归作者所有,如有侵权联系小编删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WireShark之抓包过滤链接部分

1 问题 我们打开WireShark&#xff0c;开始抓包&#xff0c;然后浏览器输入http链接地址&#xff0c;那我们怎么快速在WireShark里面找到 2 解决办法 1&#xff09;在WireShark里面输入http 2 ) Ctrl F,然后选择字符串&#xff0c;然后在字符串的右边输入 我们要过滤的部分…

最通俗易懂的依赖注入之生命周期

这篇文章是 ASP.NET 6 依赖注入系列文章的第二篇&#xff0c;点击上方蓝字可以阅读整个系列。在上一篇文章中&#xff0c;我们讨论了什么是依赖注入和控制反转&#xff0c;以及它的作用是什么。在这篇文章中&#xff0c;我们先演示一下依赖注入的基本用法&#xff0c; 然后再讨…

Cnblogs自定义皮肤css样式-星空观测者

不知不觉来Cnblogs也这么久了&#xff0c;然而Blogs提供的主题还是依旧那么复古&#xff0c;总觉得阅读起来难免枯燥&#xff0c;虽然我认为做技术不可以太过浮躁&#xff0c;但是一个美观的主题终究是吸引人眼的第一要素。 毕竟这么久了&#xff0c;在博客园还没有发现一个比较…

我的世界java版forge怎么用_我的世界电脑版MOD怎么用 我的世界pc版forge怎么安装...

我的世界由游戏本体以及启动器两部分组成&#xff0c;要玩游戏就要下载好本体再用启动器启动&#xff0c;单有游戏或者单有启动器都是玩不成的&#xff0c;想知道我的世界电脑版怎么开始&#xff0c;我的世界pc版启动器怎么用就来看看吧&#xff01;▍MOD怎么用1.安装MOD前要先…

C#趣味程序---百鸡百钱

问题&#xff1a;公鸡一只5元&#xff0c;母鸡一只3元&#xff0c;小鸡三只1元&#xff0c;问100元可以买多少只鸡&#xff1f; using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){int z, i0;for (int x 0; x < 20; x)for (int …

python面向对象设计管理系统_python面向对象之单例设计模型

单例目标单例设计模式__new__ 方法Python 中的单例01. 单例设计模式设计模式设计模式 是 前人工作的总结和提炼&#xff0c;通常&#xff0c;被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码…

【C语言简单说】十八:二维数组

这里可能会让大家脑袋迷糊&#xff0c;不过没事&#xff0c;多动动脑。 这一节我们来说二维数组&#xff0c;啥叫二维数组&#xff1f;之前我们那个是一维数组&#xff0c;好了&#xff0c;我们接下来大家就会慢慢的搞懂的。 我们的一维数组就像 一列排得整整齐齐的队伍&…

移动web开发(一)——移动web开发必备知识

参考: 移动终端开发必备知识.http://isux.tencent.com/mobile-development-essential-knowledge.html

剑指offer之求两个链表的第一个公共节点

1 问题 输入两个链表&#xff0c;找出它们的第一个公共结点。 含有公共节点的两个链表的结构类似于下图中的链表&#xff1a; 1 -> 2 -> 3 -> 4 ->5 2 -> 4 ->5 可以看到两个链表中有一个公共节点&#xff0c;其中4节点就是这两个链表的公共节点 2 分析…

.Net Core 限流控制-AspNetCoreRateLimit

简介AspNetCoreRateLimit是ASP.NET核心速率限制框架&#xff0c;能够对WebApi&#xff0c;Mvc中控制限流&#xff0c;AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件&#xff0c;每个中间件都可以为不同的场景设置多个限&#xff0c;该框架的作者是stefan…

应用系统日志采集解决方案

概述 基于Flume MongoDB&#xff0c;对现有的多个应用系统进行日志采集。特点 采集范围每一次用户请求的请求信息。数据量大尽量减少现有系统的改动数据流图 说明&#xff1a;首先考虑的结构体系&#xff0c;是直接在应用系统中&#xff0c;将日志数据写到Flume&#xff1b;但…

0x00000001java_「十六进制表示」0x00000001是个啥?32位表示、十六进制表示 - seo实验室...

十六进制表示0x0000 0001首先他是个16进制的数字、8进制的是0开头的、比如 077 他是八进制的、十进制的话就是63、7*87630x0000 0001他表示一个32位的、因为十六进制的一位有16种变化、四位的变化也是16种。那么、想表示32位的数据、需要16进制的bit 0000 0000 0000 0000 0000 …

每个程序员都可能犯过的10个错误

1. 面向编译器写代码&#xff0c;而不是面向用户 当人们使用编译器创建自己的 app 时&#xff0c;在把自己的想法诉诸于机器代码的过程中&#xff0c;常常会将那些可以使得编程更为简单却又冗长的语法遗忘于脑后。 无论你使用的是单字母的标识符还是更易于人脑理解的标识符&…

C#趣味程序---爱因斯坦的台阶问题

问题&#xff1a;设有一阶梯&#xff0c;每步跨2阶&#xff0c;最后余1阶&#xff1b;每步跨3阶&#xff0c;最后余2阶&#xff1b;每步跨5阶&#xff0c;最后余4阶&#xff1b;每步跨6阶&#xff0c;最后余5阶&#xff1b;每步跨7阶&#xff0c;刚好到阶顶&#xff0c;问共有多…

【C语言简单说】十九:二维数组循环嵌套(1)

(▼ _ ▼) 又到了这一节 了&#xff0c;这是痛苦的一节&#xff0c;因为我完全不懂如何像新手说明循环嵌套。。。 因为很多新手理解不了。&#xff0c;我就直接拿我以前的教程复制上来了。 首先先说循环嵌套&#xff1a; 循环嵌套的意思就是循环里面有一个循环&#xff0c;例…

剑指offer之C语言实现链表(两种方式)

1 问题 用C语言实现链表 2 代码实现 #include <stdio.h> #include <stdlib.h>#define true 0 #define false -1typedef struct Node {int value;struct Node *next; } List;/***初始化链表*/ struct Node* init_list() {struct Node *head (struct Node*)malloc…

python数据类型描述_【文山玩Python】用python的数据类型,来简单的描述世界

前文讲过&#xff0c;编程语言是对现实世界的抽象与模拟&#xff0c;那么数据类型就是用来构造模拟现实世界的工具。那么python中的数据类型&#xff0c;在现实生活中可以找到那些原型呢&#xff1f;我们先回顾一个幼儿教育的过程&#xff1a;出生后&#xff0c;我们先教的是什…

Xamarin效果第二十二篇之录音效果

在前面文章中简单玩了玩GIS的基本操作、Mark相关、AR、测距、加载三维白模和可扩展浮动操作;今天抽空再来分享一下录音效果;啥也不说了都在效果里:1、首次尝试了开源的Plugin.AudioRecorder结果发现没效果,也可能是我的姿势不对:https://github.com/NateRickard/Plugin.AudioRe…

@action 注解

下载 注解配置 private String fileName; private String contentType "application/octet-stream"; Action(value "/download", results { Result(name "download", type"stream", params{ "contentType"…

从零开始来看一下Java泛型的设计

引言 泛型是Java中一个非常重要的知识点&#xff0c;在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计&#xff0c;将会涉及到通配符处理&#xff0c;以及让人苦恼的类型擦除。 泛型基础 泛型类 我们首先定义一个简单的Box类&#xff1a; public c…