基于Opencv的图片人脸检测

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

效果图:
(图片在百度图片搜索而来,如有侵权请联系我。)
基于Opencv的图片人脸检测_第1张图片

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

SciPy模块。 安装方法 pip install scipy

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

模块名 功能
scipy.constants 数学常量
scipy.integrate 插值
scipy.misc 数据输入输出
scipy.linalg 线性代数
scipy.ndimage N维图像
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

基于Opencv的图片人脸检测_第2张图片

你可能感兴趣的:(#,机器学习,#,Opencv)