基于OpenCV和Gradio实现简单的人脸识别详解

作者:Livingbody 时间:2022-10-21 22:59:11 

环境配置

  • gradio 安装 pip install gradio

  • cv2 安装 pip install python-opencv

实验原理

cv2有预训练模型face_cascade,可以对人脸进行检测,检测到人脸,绘制框框标识。

完成检测,调用cv2进行显示。

基于OpenCV和Gradio实现简单的人脸识别详解

程序设计

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 10 17:11:06 2022

@author: liujianjian
"""
import gradio as gr
import time
import cv2

#############这里需要添加绝对路径###################
pathf = './haarcascades/haarcascade_frontalface_alt.xml'
pathe = './haarcascades/haarcascade_eye.xml'
###########################################

1.上传图片

上传图片采用gradio,直接上传即可,或者可加入demo图片,供选择。

demo = gr.Interface(
   face_rec,
   gr.Image(),
   "image",    
   examples=["images/1.jpg", "images/2.jpg", "images/3.jpg", "images/4.jpg"],
)

2.人脸识别

人脸识别简单,复制配置文件到本地,加载进去即可。

# 转为灰度图
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   # 创建人脸识别分类器
   face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
   face_cascade.load('./haarcascades/haarcascade_frontalface_default.xml')
   # 创建人眼识别分类器
   eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
   face_cascade.load('./haarcascades/haarcascade_eye.xml')
   # 检测人脸
   faces = face_cascade.detectMultiScale(gray,
                                         scaleFactor=1.15,
                                         minNeighbors=3,
                                         flags=cv2.IMREAD_GRAYSCALE,
                                         minSize=(40, 40))

3.绘制方框

就是绘制方框了,绘制显示即可。

# 在人脸周围绘制方框
   for (x, y, w, h) in faces:
       img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
   # 进行眼部检测
   eyes = eye_cascade.detectMultiScale(gray,
                                       scaleFactor=1.1,
                                       minNeighbors=3,
                                       flags=cv2.IMREAD_GRAYSCALE,
                                       minSize=(3, 3))
   for (ex, ey, ew, eh) in eyes:
       # 绘制眼部方框
       img = cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

4.保存预测结果

调用cv2.imwrite即可,注意图像转换。

cv2.imwrite(f"result/{time.time_ns()}.jpg", cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

5.最后运行gradio的lauch

if __name__ == "__main__":
   demo.launch()

基于OpenCV和Gradio实现简单的人脸识别详解

完整代码

# -*- coding: utf-8 -*-
"""
Created on Sun April 4 17:11:06 2023

@author: liujianjian
"""
import gradio as gr
import time
import cv2

#############这里需要添加绝对路径###################
pathf = './haarcascades/haarcascade_frontalface_alt.xml'
pathe = './haarcascades/haarcascade_eye.xml'
###########################################

# 人脸检测函数
def face_rec(img):
   # 转为灰度图
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   # 创建人脸识别分类器
   face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
   face_cascade.load('./haarcascades/haarcascade_frontalface_default.xml')
   # 创建人眼识别分类器
   eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
   face_cascade.load('./haarcascades/haarcascade_eye.xml')
   # 检测人脸
   faces = face_cascade.detectMultiScale(gray,
                                         scaleFactor=1.15,
                                         minNeighbors=3,
                                         flags=cv2.IMREAD_GRAYSCALE,
                                         minSize=(40, 40))

# 在人脸周围绘制方框
   for (x, y, w, h) in faces:
       img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
   # 进行眼部检测
   eyes = eye_cascade.detectMultiScale(gray,
                                       scaleFactor=1.1,
                                       minNeighbors=3,
                                       flags=cv2.IMREAD_GRAYSCALE,
                                       minSize=(3, 3))
   for (ex, ey, ew, eh) in eyes:
       # 绘制眼部方框
       img = cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

cv2.imwrite(f"result/{time.time_ns()}.jpg", cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
   return img

demo = gr.Interface(
   face_rec,
   gr.Image(),
   "image",    
   examples=["images/1.jpg", "images/2.jpg", "images/3.jpg", "images/4.jpg"],
)

if __name__ == "__main__":
   demo.launch()

项目地址: https://github.com/livingbody/face_det_cv2

来源:https://juejin.cn/post/7219225476706730042

标签:OpenCV,Gradio,人脸识别
0
投稿

猜你喜欢

  • python画图时设置分辨率和画布大小的实现(plt.figure())

    2022-11-09 18:12:17
  • PHP实现根据数组某个键值大小进行排序的方法

    2023-11-15 00:35:55
  • 本地计算机无法启动Apache故障处理

    2023-07-17 13:06:48
  • 避免Adodb.Stream输出UTF-8时自动写入的BOM(asp)

    2011-08-24 20:32:56
  • python 含子图的gif生成时内存溢出的方法

    2022-11-30 05:33:12
  • PHP中DirectIO操作文件扩展的用法大全

    2023-06-13 13:58:45
  • 两个JS之间的函数互相调用方式

    2024-04-10 10:39:45
  • python smtplib发送带附件邮件小程序

    2023-03-24 17:14:26
  • Python竟能画这么漂亮的花,帅呆了(代码分享)

    2021-02-04 15:50:00
  • Python元组的定义及使用

    2021-06-30 01:24:40
  • SQL Server"错误 21002: [SQL-DMO]用户 * 已经存在问题解决

    2024-01-16 16:01:55
  • 玩转Python发短信的实现

    2021-09-17 20:38:54
  • Python基于纹理背景和聚类算法实现图像分割详解

    2023-11-15 20:05:46
  • php插件Xajax使用方法详解

    2023-10-19 23:28:40
  • 对pyqt5中QTabWidget的相关操作详解

    2021-12-15 16:54:54
  • 关于Flask 视图介绍

    2022-10-21 15:07:34
  • 制定设计的原则

    2011-01-10 20:43:00
  • 详解使用vue实现tab 切换操作

    2023-07-02 17:06:39
  • python读取中文txt文本的方法

    2021-06-10 03:55:51
  • tf.nn.conv2d与tf.layers.conv2d的区别及说明

    2021-03-29 13:36:53
  • asp之家 网络编程 m.aspxhome.com