手把手教你利用opencv实现人脸识别功能(附源码+文档)
作者:川川菜鸟 发布时间:2022-01-24 23:55:37
标签:opencv,人脸,检测
一、环境
pip install opencv-python
python3.9
pycharm2020
人狠话不多,直接上代码,注释在代码里面,不说废话。
二、使用Haar级联进行人脸检测
测试案例:
代码:(记得自己到下载地址下载对应的xml)
# coding=gbk
"""
作者:川川
@时间 : 2021/9/5 16:38
https://github.com/opencv/opencv/tree/master/data/haarcascades
"""
import cv2
# 待检测的图片路径
imagepath="2.jpg"
image = cv2.imread(imagepath)#读取图片
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#图像转换为灰度图:
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')#加载使用人脸识别器
faces = face_cascade.detectMultiScale(gray)#检测图像中的所有面孔
#为每个人脸绘制一个蓝色矩形
for x, y, width, height in faces:
# 这里的color是 蓝 黄 红,与rgb相反,thickness设置宽度
cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
# 最后,让我们保存新图像
cv2.imwrite("beauty_detected.jpg", image)
效果:
效果可以看出这个效果并不是很好。
三、Haar级联结合摄像头
代码:(还是用的前面得xml)
# coding=gbk
"""
摄像头人脸识别
作者:川川
@时间 : 2021/9/5 17:15
Haar级联结合摄像头
"""
import cv2
#创建新的cam对象
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#初始化人脸识别器(默认的人脸haar级联)
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
while True:
# 从摄像头读取图像
_, image = cap.read()
# 转换为灰度
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测图像中的所有人脸
faces = face_cascade.detectMultiScale(image_gray, 1.3, 5)
# 为每个人脸绘制一个蓝色矩形
for x, y, width, height in faces:
cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
cv2.imshow("image", image)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
效果:
四、使用SSD的人脸检测
代码:
# coding=gbk
"""
图片人脸识别
作者:川川
@时间 : 2021/9/5 17:22
"""
import cv2
import numpy as np
# 下载链接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
prototxt_path = r"./deploy.prototxt.txt"
# 下载链接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel
model_path =r"./res10_300x300_ssd_iter_140000_fp16.caffemodel"
model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
image = cv2.imread("2.jpg")
h, w = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))
model.setInput(blob)
output = np.squeeze(model.forward())
font_scale = 1.0
for i in range(0, output.shape[0]):
confidence = output[i, 2]
if confidence > 0.5:
box = output[i, 3:7] * np.array([w, h, w, h])
start_x, start_y, end_x, end_y = box.astype(np.int)
cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.imwrite("beauty_detected.jpg", image)
效果:
我们可以看到现在的识别效果非常好了。
五、 SSD结合摄像头人脸检测
代码:
# coding=gbk
"""
作者:川川
@时间 : 2021/9/5 17:26
SSD结合摄像头的人脸检测
"""
import cv2
import numpy as np
prototxt_path = "deploy.prototxt.txt"
model_path = "res10_300x300_ssd_iter_140000_fp16.caffemodel"
model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
cap = cv2.VideoCapture(0)
while True:
_, image = cap.read()
h, w = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
model.setInput(blob)
output = np.squeeze(model.forward())
font_scale = 1.0
for i in range(0, output.shape[0]):
confidence = output[i, 2]
if confidence > 0.5:
box = output[i, 3:7] * np.array([w, h, w, h])
start_x, start_y, end_x, end_y = box.astype(np.int)
cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
cv2.imshow("image", image)
if cv2.waitKey(1) == ord("q"):
break
cv2.destroyAllWindows()
cap.release()
效果:
可以发现SSD效果特别好!
六、结语
如果你想更深了解这些原理,去读一下opencv文档吧,中文官方文档如下:
https://woshicver.com/
在很多人调用xm会遇到一些坑,我在这里说一下,读取xml的时候用相对路径./这种,参考我的,建议不要路径中出现中文,其它没啥了。
来源:https://blog.csdn.net/weixin_46211269/article/details/120118177


猜你喜欢
- 一、问题描述最近遇到一个问题,也就是使用分区表进行数据查询/加载的时候比普通表的性能下降了约50%,主要瓶颈出现在CPU,既然是CPU瓶颈理
- 大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题: 1、数据库超过一定尺寸,
- datetime日期时间类,主要熟悉API,时区的概念与语言无关。from datetime import datetime as dtdt
- 在项目开发的过程中可能需要开放自己的数据库给别人,但是为了安全不能自己服务器里其他数据库同时开放。那么可以新建一个用户,给该用户开放特定数据
- 本文实例讲述了Python面向对象类继承和组合。分享给大家供大家参考,具体如下:在python3中所有类默认继承object,凡是继承了ob
- power(x, y) 函数,计算 x 的 y 次方。示例:x 和 y 为单个数字:import numpy as npprint(np.p
- 本文实例讲述了JavaScript实现同步于本地时间的动态时间显示方法。分享给大家供大家参考。具体分析如下:动态显示时间的例子非常简单,了解
- 本文的主要内容是向大家分享几个Python面试中的T题目,同时给出了答案并对其进行分析,具体如下。本文的原文是5 Great Python
- PyTorch基础入门三:PyTorch搭建多项式回归模型 1)理论简介对于一般的线性回归模型,由于该函数拟合出来的是一条直线,所
- 表结构很简单CREATE TABLE `oplogs` (`id` int(10) unsigned NOT NULL AUTO_INCRE
- 前期准备1、机器人框架的下载和配置首先需要一个qq机器人框架,我使用的是基于mirai 以及 MiraiGo 开发的go-cqhttp(里面
- 本文实例讲述了C#实现的ACCESS数据库操作类。分享给大家供大家参考,具体如下:这个是针对ACCESS数据库操作的类,同样也是从SQLHE
- 最近做一个项目(Asp.net+Sql Server 2000),在原来开发的机器上运行没有任何问题.但当我在另外一台机
- 下面给大家介绍Javascript removeChild()删除节点的方法,具体详情如下所示:在Javascript中,只提供了一种删除节
- 一、前言前几天,在写一个与差分隐私相关的简单程序时,我发现了一些奇怪的东西:相对于其他的随机数生成函数,Python的random.rand
- 微信小程序报错VM1305:1 thirdScriptErrorCannot read property 'name' of
- 当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm 文件的报错好像暗示着操作系统的
- 字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表
- 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。本章节我们将为大家介绍如
- for循环在Python中有遍历所有序列的项目,如列表或一个字符串。语法:for循环语法如下:for iterating_var