基于Opencv的图片人脸检测

本篇内容介绍如何使用opencv,scipy,tensorflow来实现计算机人脸检测。(用一点也是用 =.=)
先声明一下,本篇内容是在图片中的人脸检测,
调动计算机摄像头的人脸识别链接:
链接:https://blog.csdn.net/weixin_43582101/article/details/88913164

效果图:
(图片在百度图片搜索而来,如有侵权请联系我。)
在这里插入图片描述

先介绍一下要使用的模块:

SciPy模块。 安装方法 pip install scipy

SciPy是一款方便、易于使用、专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

模块名功能
scipy.constants数学常量
scipy.integrate插值
scipy.misc数据输入输出
scipy.linalg线性代数
scipy.ndimageN维图像
scipy.optimize优化算法
scipy.signal信号处理
scipy.sparse稀疏矩阵
scipy.spatial空间数据结构和算法
scipy.stats统计函数

还有一些我没有往上写,比如scipy.io,看起来有点多了,我们这里只使用scipy中的misc,跟scipy.io一样都是一种用于输入和输出的实用模块,以图像形式保存数组。因为我们需要对图像进行操作,并且需要使用数组对象来做运算,所以将数组直接保存为图像文件非常有用。

tensorflow。 安装方法 pip install tensorflow

这个先不介绍太多,简单说下。

tensorFlow 是目前世界上最受欢迎的开源机器学习框架。
是一种计算图模型,即用图的形式来表示运算过程的一种模型。Tensorflow程序一般分为图的构建和图的执行两个阶段。图的构建阶段也称为图的定义阶段,该过程会在图模型中定义所需的运算,每次运算的的结果以及原始的输入数据都可称为一个节点。

opencv。 安装方法 pip install opencv-python

装起来可能会有点麻烦,有一些版本兼容问题。安装详情可以看这,python3.6安装open-cv

opencv全称是 open source computer vision library (开源计算机视觉库)

OpenCV 使用 C/C++ 开发,同时也提供了 Python、Java、MATLAB 等其他语言的接口 OpenCV 是跨平台的,可以在
Windows、Linux、Mac OS、Android、iOS 等操作系统上运行。 OpenCV
的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。 OpenCV
还提供了机器学习模块,你可以使用正态贝叶斯、K最近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。

matplotlib。 安装方法 pip install matplotlib
这个应该很熟悉的,最python的绘图库,没啥多说的。下面开始分析代码。

代码解析:

我按照顺序从头到尾来分析这段代码

首先导入库:

from scipy import misc                  # pip install scipy
import tensorflow as tf                 # pip install tensorflow
from face_check import detect_face
import cv2                              # pip install opencv-python
import matplotlib.pyplot as plt         # pip install matplotlib

设置默认值:

minsize = 20                             # minimum size of face     最小尺寸
threshold = [ 0.6, 0.7, 0.7 ]            # three steps's threshold  阈值
factor = 0.709                           #  scale factor            网格参数
 
print('Creating and loading')

tf.Graph().as_default() 表示将这个类实例
tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph() 来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。

with tf.Graph().as_default():           #将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图
        sess = tf.Session(config=tf.ConfigProto(log_device_placement=False))
        with sess.as_default():
            pnet, rnet, onet = detect_face.create_mtcnn(sess, None)

detect_face函数之图像金字塔
人脸检测的函数是就是detect_face,这个就是人脸检测的核心的难点了。
这个文件是本地导入的,他和全部代码我在最后会补上githup的链接。

检测人脸,返回人脸框和五个关键点的坐标
detect_face在图像中它们返回包围框和点。创建一个扩展的因素金字塔检测图像

image_path = '1.jpg'
img = misc.imread(image_path)            		 #读取图片
bounding_boxes, _ = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
nrof_faces = bounding_boxes.shape[0] #人脸数目
print('找到人脸数目为:{}'.format(nrof_faces))    #返回检测结果
print(bounding_boxes)                      		##返回关键点的坐标

通过上面获取的坐标来在我们的要绘制的图中进行数据标注。
astype(int) 变量类型转换
cv2.rectangle通过对角线来画矩形
cv2.resize图片缩放,参数输入是 宽×高×通道

crop_faces=[]
for face_position in bounding_boxes: 			   #遍历一下
    face_position=face_position.astype(int)        #变量类型转换
    print(face_position[0:4])
        											#通过对角线来画矩形
    cv2.rectangle(img, (face_position[0], face_position[1]), (face_position[2], face_position[3]), (0, 255, 0), 2)
    crop=img[face_position[1]:face_position[3],
             face_position[0]:face_position[2],]
													#cv2.resize图片缩放,参数输入是 宽×高×通道
    crop = cv2.resize(crop, (96, 96), interpolation=cv2.INTER_CUBIC )
    print(crop.shape)								#查看矩阵结构
    crop_faces.append(crop)
   # plt.imshow(crop)
    plt.show()    #展示
    
plt.imshow(img)  #显示图片
plt.show()

代码从头到尾结束了。其中的from_check import detect_face贴不了
detect_face文件我已经上传到githup

链接:https://github.com/lixi5338619/face_check

在这里插入图片描述

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
首先,在Python中安装OpenCV库。在终端输入以下命令: ``` pip install opencv-python ``` 接下来,我们可以使用以下代码来实现基于OpenCV人脸检测算法: ```python import cv2 # 加载分类器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载图像 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5) # 在图像中标记人脸 for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示图像 cv2.imshow('img', img) cv2.waitKey() ``` 解释一下代码: 1. 加载分类器:我们使用OpenCV内置的CascadeClassifier函数来加载人脸检测分类器。这里使用的是`haarcascade_frontalface_default.xml`,你可以在OpenCV官网上找到并下载其他分类器。 2. 加载图像:我们使用`cv2.imread()`函数来加载测试图像。 3. 转换为灰度图像:我们将图像转换为灰度图像,因为分类器需要输入灰度图像。 4. 检测人脸:我们使用`detectMultiScale()`函数来检测人脸。`scaleFactor`和`minNeighbors`参数可以调整检测的精度和速度。 5. 标记人脸:我们使用`cv2.rectangle()`函数在图像中标记人脸。 6. 显示图像:最后,我们使用`cv2.imshow()`和`cv2.waitKey()`函数来显示图像,并等待用户按下任意键关闭窗口。 这就是基于OpenCV人脸检测算法的实现。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考古学家lx(李玺)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值