手把手教你利用opencv实现人脸识别功能(附源码+文档)

作者:川川菜鸟 时间:2022-01-24 23:55:37 

一、环境


pip install opencv-python

python3.9

pycharm2020

人狠话不多,直接上代码,注释在代码里面,不说废话。

二、使用Haar级联进行人脸检测

测试案例:

手把手教你利用opencv实现人脸识别功能(附源码+文档)

代码:(记得自己到下载地址下载对应的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)

效果:

手把手教你利用opencv实现人脸识别功能(附源码+文档)

效果可以看出这个效果并不是很好。

三、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()

效果:

手把手教你利用opencv实现人脸识别功能(附源码+文档)

四、使用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)

效果:

手把手教你利用opencv实现人脸识别功能(附源码+文档)

我们可以看到现在的识别效果非常好了。

五、 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()

效果:

手把手教你利用opencv实现人脸识别功能(附源码+文档)

可以发现SSD效果特别好!

六、结语

如果你想更深了解这些原理,去读一下opencv文档吧,中文官方文档如下:

https://woshicver.com/

在很多人调用xm会遇到一些坑,我在这里说一下,读取xml的时候用相对路径./这种,参考我的,建议不要路径中出现中文,其它没啥了。

来源:https://blog.csdn.net/weixin_46211269/article/details/120118177

标签:opencv,人脸,检测
0
投稿

猜你喜欢

  • DIV+CSS高度自适应网页代码实例

    2008-09-20 08:00:00
  • python 装饰器的使用示例

    2021-05-15 00:52:09
  • Python判断字符串是否为字母或者数字(浮点数)的多种方法

    2023-04-12 07:55:47
  • python+opencv实现视频抽帧示例代码

    2023-02-13 01:40:19
  • 分页技术原理与实现之分页的意义及方法(一)

    2024-01-26 14:29:16
  • 教你使用一行Python代码玩遍童年的小游戏

    2021-05-15 10:14:00
  • 解析:MySQL 数据库搜索中大小写敏感性

    2009-02-23 17:32:00
  • js插入flash可防止虚线框激活

    2009-03-13 13:31:00
  • Python实现简单的"导弹" 自动追踪原理解析

    2021-04-15 05:48:27
  • mysql连接查询详解

    2024-01-15 16:42:11
  • python处理文本文件实现生成指定格式文件的方法

    2022-01-07 21:41:43
  • Python删除n行后的其他行方法

    2022-07-01 15:06:29
  • 提醒各位一下,IE透明会失效的

    2009-03-31 12:48:00
  • Oracle中SQL语句连接字符串的符号使用介绍

    2024-01-21 06:12:11
  • 一文搞懂Python中subprocess模块的使用

    2023-12-05 16:35:05
  • Python两台电脑实现TCP通信的方法示例

    2023-09-07 04:17:34
  • Django restframework 源码分析之认证详解

    2021-08-15 12:03:40
  • python实现合并多个list及合并多个django QuerySet的方法示例

    2023-11-25 06:43:13
  • mysql 修改表结构 判断并添加column

    2010-10-25 20:07:00
  • JavaScript中CreateTextFile函数

    2024-04-18 10:49:03
  • asp之家 网络编程 m.aspxhome.com