python+opencv入门-动手实现人脸检测_任务描述 本关任务:利用 opencv 对图片进行相应的处理。 相关知识 为了完成本关任-程序员宅基地

技术标签: python  计算机视觉  深度学习  人工智能  opencv  

python+opencv入门-动手实现人脸检测

参考文章
https://www.educoder.net/shixuns/2pwliuxy/challenges

任务描述

本关任务:利用 openCV 对图片进行相应的处理。

相关知识

为了完成本关任务,你需要掌握:
1 . 人脸检测。
2 . 如何利用 openCV 实现人脸检测。

人脸检测

在上一关,我们已经知道如何去检测图片中人物的性别。然而,在真实项目中,我们不仅仅是需要知道图片中人物的性别,有时候还需要将图片中人脸的位置检测出来。
在这里插入图片描述
如上图,我们用一个方框将人脸部分给划分出来,人脸检测就是需要找出这个方框的正确位置。需要将检测框位置确定下来需要知道四个参数:
1.x:检测框左上角点的横坐标。
2.y:检测框左上角点的纵坐标。
3.w:检测框宽的值。
4.h:检测框高的值。

在这里插入图片描述
如何确定这四个参数的值其实与上一关相似,都需要构建一个损失函数再进行优化,只不过上一关是分类问题,而这一关是回归问题。

如何利用openCV实现人脸检测

跟其它任务一样,要进行人脸检测首先得加载待检测图片:

import cv2
#加载图片
img = cv2.imread(img_path,1)
#转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

其中,cv2.imread() 为加载图片方法,参数 img_path 为待识别图片路径, 1 表示加载 BGR 图片,接下来再使用 cv2.cvtColor() 方法将图片转换为灰度图。 img 为待处理图片,cv2.COLOR_BGR2GRAY 表示将 BGR 图转换为灰度图。
然后我们再加载已经训练好的检测模型:

#加载模型
face_cascade = cv2.CascadeClassifier(model_path)

cv2.CascadeClassifier()为加载模型方法,model_path为模型存放路径。
利用训练好的模型,我们就能检测出人脸的位置,代码如下:

#获取识别框坐标
face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)
x, y, w, h = face_rects[0]

face_cascade.detectMultiScale() 为人脸检测方法, gray 为待检测灰度图, 1.1 表示检测框按 1.1 的比例放大, 10 表示一个目标至少要被检测到 10 次才算真正的目标。(x,y) 为检测框左上角坐标,w,h 为检测框宽高长度值。
最后,我们将检测框添加进图像中并保存图像:

#将识别框加入图片中
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
#保存图片
cv2.imwrite(img_save_path,img)

img 为目标图片,(x,y) 为检测框左上角坐标,(x+w,y+h) 为右下角坐标。 (255,0,0) 表示蓝色,(0,255,0) 表示绿色,(0,0,255) 表示红色,3 表示 BGR 三个通道。

编程实践

编辑器补充代码,实现人脸检测方法。
0在这里插入图片描述 方便复制学习

# -*- coding: utf-8 -*-#完整代码!
import cv2


def face_detection(img_path,img_save_path,model_path):    
   '''    
   img_path:待识别图片路径
   img_save_path:图片保存路径
   model_path:模型所在路径    
   '''      
   #********* Begin *********#    
   #加载图片    
   img = cv2.imread(img_path,1)    
   #转换为灰度图    
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    
   #加载模型    
   face_cascade = cv2.CascadeClassifier(model_path)    
   #获取识别框坐标    
   face_rects = face_cascade.detectMultiScale(gray, 1.1, 10)    
   x, y, w, h = face_rects[0]    
   #将识别框加入图片中    
   cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)    
   #保存图片    
   cv2.imwrite(img_save_path,img)    
   #********* End *********#    
   return face_rects[0]



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46742690/article/details/106559552

智能推荐

最经典的Linux内核学习方法论_ifeq ($(config_usb_module),)-程序员宅基地

文章浏览阅读2.6k次。最经典的Linux内核学习方法论原文转自:http://tech.it168.com/a2010/0510/884/000000884174_all.shtml Makefile不是Make Love  从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉。毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢_ifeq ($(config_usb_module),)

多重网络与计算机之间是感叹号,win10系统连接网络出现多重网络的设置教程-程序员宅基地

文章浏览阅读1.1k次。win10系统使用久了,好多网友反馈说win10系统连接网络出现多重网络的问题,非常不方便。有什么办法可以永久解决win10系统连接网络出现多重网络的问题,面对win10系统连接网络出现多重网络的图文步骤非常简单,只需要  一、 打开电脑win10系统的任务栏,然后看到一个“网络和共享中心”选项打开它,就看到了网络和interne的窗口上,在选择“更改适配器设置”这个选项。  二、我们点击打开了“..._电脑多重网路怎么设置

framework.jar文件push进去不起效_android 11 push framework方法-程序员宅基地

文章浏览阅读613次。Android源码编译结果中framework/arm目录和framework/arm64目录(如果有的话)中的boot.art和boot.oat两个文件替换掉系统相应的/system/framework/arm目录和/system/framework/arm64目录中的同名文件,也可以把framework.jar给push进/system/framework/中,然后把/system/fra..._android 11 push framework方法

编码规范(一)----JAVA注释规范_java 注释规范-程序员宅基地

文章浏览阅读3.4w次,点赞26次,收藏120次。一、前言好的代码规范是一个程序员的基本修炼,好的代码注释更能体现一个程序员的思维逻辑,虽然代码是用来给机器运行的,我们只要能写出能让编译器运行的代码就行了,但是如果没有好的编码规范,到项目后期,加入开发的人员逐渐增多时,每个人的编码风格都不一样,这就会让项目维护者很难维护,所以开始就要制定一些好的规范来让大家遵守,这样才能写出可维护,健壮的项目,这就是接下来要做的事情。第一节从要从代码_java 注释规范

Qt设置Widget窗口背景图片_qt的窗口背景图片更换-程序员宅基地

文章浏览阅读195次。1)声明重绘事件Qt中的重绘事件是Qt默认的函数,只需要对其自己编写定义,当窗口运行时,程序就会自动调用重绘事件 ,首先我们需要在头文件中声明重绘事件#include <QPaintEvent> //添加头文件... ... protected: void paintEvent(QPaintEvent *event); //重绘事件2)重绘事件定义在cpp文件中对重绘事件重新编写,比如这里我们想要让窗口背景设置成一张图片//添加绘画头文件#incl_qt的窗口背景图片更换

蛮力法解决01背包问题-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏66次。蛮力法:设计算法求解背包问题,并编程实现。背包问题: 给定重量分别为,价值分别为的n件物品,和一个承重为W的背包。求这些物品中一个最有价值的子集,并能装到背包中。背包问题的蛮力解法是穷举这些物品的所有子集,找出能够装到背包中的所有子集,并在这些子集中找出价值最大的子集。实验:编写程序,实现背包问题的蛮力算法。并针对以下两个实例,求出能装到背包中的价值最大的子集。要求输出:最优可..._蛮力法解决01背包问题

随便推点

python------给定一个句子(只包含字母和空格),将句子中的单词位置反转,单词用 空格分割, 单词之间只有一个空格,前后没有空格。_给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词-程序员宅基地

文章浏览阅读9k次,点赞5次,收藏23次。python之字符串练习2:将句子中的单词位置反转1)题目描述> 给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。比如: (1) “hello xiao mi”-> “mi xiao hello”输入描述:> 输入数据有多组,每组占一行,包含一个句子(句子长度小于1000个字符)输出描述:> 对于每个测试示例,要求输出句子中单词反转后形成的句子示例1:- 输入 hello xiao mi_给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词

Dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错怎么解决?_error infos: dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器-程序员宅基地

文章浏览阅读1.1w次。很多站长在使用dedecms的过程中会遇到这样的错误提示“DedeCMS Error Track:DedeCMS错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错!”,那么这到底是什么原因引起的呢?一般情况下,出现这种提示问题是因为dedecms没有正确的和数据库服务器连接,主机吧分析主要原因有以下三种:一、您的数据库服务器出现了问题,如果您买的是虚拟主机或者是_error infos: dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器

ECT输入捕捉--T法测脉冲_ect_tc0-程序员宅基地

文章浏览阅读2.1k次。引自百度知道:速度测量是工控系统中最基本的需求之一,最常用的是用数字脉冲测量某根轴的转速,再根据机械比、直径换算成线速度。脉冲测速最典型的方法有测频率(M法)和测周期(T法)。定性分析:  M法是测量单位时间内的脉数换算成频率,因存在测量时间内首尾的半个脉冲问题,可能会有2个脉的误差。速度较低时,因测量时间内的脉冲数变少,误差所占的比例会变大,所以M法宜测量高速。如要降低测量的速度下限,可以提高编..._ect_tc0

新装ubuntu 12.04 , 使用技巧-程序员宅基地

文章浏览阅读81次。***********************************************一、让Ubuntu 12.04开机默认进入命令行模式.修改 /etc/default/grubGRUB_CMDLINE_DEFAULT_LINUX="quiet splash" 改成 GRUB_CMDLINE_DEFAULT_LINUX="text" 再sudo update-grub重启OK!..._libreoffice xlib extension

【语音识别】电话按键语音识别(连续语音数字)【含Matlab源码 3416期】-程序员宅基地

文章浏览阅读636次,点赞13次,收藏23次。电话按键语音识别(连续语音数字)完整的代码,包运行;运行操作视频见CSDN资源!适合小白!

ABAP学习----ALV注意事项_abap alv多久学会-程序员宅基地

文章浏览阅读1k次。2018年/8月/1日。 到今天为止,学习ABAP大概快一个月了,我知道一个月,对于任何一门计算机语言来说,都只能说才了解,更何况是在自学,没有视频的情况下。ABAP语言相对其他语言来说,较为封闭,因为它只能在SAP系统里才能编写实现,而SAP系统对于个体户来说,安装太不现实。应该说几乎所有的ABAP开发人员都是在项目上学习的。幸运的是,我碰巧来到一个实施SAP的项目,目前在学习ABAP开发。 ..._abap alv多久学会