手把手教你利用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
0
投稿
猜你喜欢
- 如何在ADO服务器端利用好缓存技术?请看下面示例,这是一个用来显示图书分类的例子程序:displayBooks.asp< %
- 小整数/* interpreter state */#define _PY_NSMALLPOSINTS &nbs
- 场景一、有一个输入金额的场景,这个金额需要验证,验证说明如下:不能为空格;不能为0;不能为汉字;不能为其它字符;不能大于200;唯一可以的是
- 问题:python+Flask 反复调用model报错ValueError: Tensor Tensor("dense_2/Sof
- 看代码吧~package mainimport ("fmt""io""net/http&q
- 在你自己安装了一个新的MySQL服务器后,你需要为MySQL的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL
- PDO::_constructPDO::_construct — 创建一个表示数据库连接的 PDO 实例(PHP 5 >= 5.1.0
- 之前在一个web系统的设计中,和另一个设计师讨论,“保存”和“取消”按钮该怎么设计。我的观点是,保存是比取消更常用的按钮,也是用户的主要目的
- 目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。 这些算法已被用于在游戏、机器
- 问题你想在使用范围内执行某个代码片段,并且希望在执行后所有的结果都不可见。解决方案为了理解这个问题,先试试一个简单场景。首先,在全局命名空间
- 前言和Word、Excel承载数据的能力相比,PPT的应用重点在于表演。比如一场发布会、一场演说、一次产品展示、一次客户沟通&hel
- #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#TYPE:
- <html><body><table border=1> <? $id=@mssql_connec
- 相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸
- 如下所示:file = open('./abc.csv')csv.reader(file, delimiter=',
- 等值线图的Python绘制方法等值线图或等高线图在科学界经常用到,它是由一些封闭的曲线组成的,来表示三维结构表面。虽然看起来复杂,其实用ma
- 内容简介展示如何给图像叠加不同等级的椒盐噪声和高斯噪声的代码,相应的叠加噪声的已编为对应的类,可实例化使用。以下主要展示自己编写的:加噪声的
- 批量生成word文件场景:需要新建多个类似文件名比如:今天的事例是新建12个文件名为:保安员考试试卷1及答案.docx保安员考试试卷2及答案
- 1、首先,界面上有个按钮触发操作:<button type="button" class="layui-
- 一般开发,SQL Server的数据库所有者为dbo.但是为了安全,有时候可能把它换成其它的名称,所有者变换不是很方便.这里列出两种供参考