《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!

前文参考:
《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现
《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造
《OpenCv视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
《OpenCv视觉之眼》Python图像处理十五 :Opencv图像处理之图像缩放、旋转和平移原理及实现
《OpenCv视觉之眼》Python图像处理十六:Opencv项目实战之图像中的硬币检测
《OpenCv视觉之眼》Python图像处理十七:Opencv图像处理实战二之图像中的物体识别并截取

上次博客我们介绍了OpenCV图像处理实战二,图像中的物体识别,也说了以上步骤的目的是为了给神经网络模型训练打基础,抠出物体中我们需要的人脸部分,当然,改步骤还可以通过OpenCV提供的人脸检测模型来进行检测人脸然后抠出;本次博客,林君学长主要带大家了解如何通过OpenCV自带的人脸检测训练模型来进行人脸检测并标注检测的位置,一起学习吧!

OpenCV图像处理实战三:基于OpenCV训练模型的AI人脸检测


[Python图像处理十八]:Opencv图像处理实战三之基于OpenCV的训练模型的AI人脸检测

  • 一、OpenCV人脸检测函数介绍
    • 1、OpenCV人脸检测模型介绍
    • 2、cv2.CascadeClassifier分类器函数介绍
    • 3、detectMultiScale()人脸检测算法介绍
    • 4、cv2.rectangle()绘制矩形人脸框
    • 5、cv2.circle()绘制圆圈人脸框
  • 二、OpenCV人脸检测
    • 1、OpenCV实现人脸检测步骤
    • 2、图像人脸检测完整代码
    • 3、视频人脸检测完整代码
    • 4、摄像头人脸检测完整代码

一、OpenCV人脸检测函数介绍

下面讲解到的函数都是我们通过OpenCV实现人脸检测将要用到的函数,接下来将会对每个函数的作用及功能进行讲解,最终实现对图片人脸的检测!

1、OpenCV人脸检测模型介绍

1)、OpenCV人脸检测模型即haarcascade_frontalface_default.xml模型文件,该模型是OpenCV官方训练好的人脸正脸检测模型,是OpenCV正面人脸检测级联分类器训练结果,在通过OpenCV对图像中的人脸键检测时,我们必须要用到该模型,至于该模型的训练,本次博客将暂时不做讲解,后面会讲到该模型是如何通过OpenCV分类器进行训练的
2)、本次博客的图像人脸检测利用cv2.CascadeClassifier级联分类器的haarcascade_frontalface_default.xml进行正脸人脸预测,我们可以看到介绍,是专注于正脸检测,因此,该模型的缺点就是只能对人脸正脸进行检测,优点是人脸正脸检测速度快,准确率高
3)、haarcascade_frontalface_default.xml模型位置
haarcascade_frontalface_default.xml模型在下载opencv-python的时候,会自动下载该模型,我们只需要找到python的安装路径,在安装路径下找到pip下载的库存放的位置,就可以找到该模型,如下:
《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测_第1张图片

2、cv2.CascadeClassifier分类器函数介绍

1)、函数原型:result=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)

  • haarcascade_frontalface_default.xml:OpenCV官方正脸人脸检测模型

2)、该函数是OpenCV中人脸检测的一个级联分类器,既可以使用Haar,也可以使用LBP特征。以Haar特征分类器为基础的对象检测技术是一种非常有效的技术。它是基于机器学习且使用大量的正负样本训练得到分类器。

  • Haar-like矩形特征:是用于物体检测的数字图像特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸
  • LBP:是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息

3、detectMultiScale()人脸检测算法介绍

1)、函数原型:result1=result.detectMultiScale(image,scaleFactor,minNeighbors,minSize,minSize)

  • result:联级分类器得到的结果
  • image:需要键人脸检测的图像
  • result1:检测到的人脸目标序列
  • scaleFactor:图像尺寸减小的比例
  • minNeighbors:每一个目标至少要被检测的次数,知道检测到这么多次才算是真的目标,因为周围的像素和不同的窗口大小都可以检测到人脸
  • minSize:目标的最小尺寸(选填)
  • minSize:目标的最大尺寸(选填)

detectMultiScale()是检测人脸算法,通过该函数实现OpenCV对图像中正人脸的检测

4、cv2.rectangle()绘制矩形人脸框

函数原型: cv2.rectangle(image, start_point, end_point, color, thickness)

  • image:需要进行矩形框绘制的图像
  • start_point:矩形的起始坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)
  • end_point:矩形的结束坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
  • color:绘制的矩形的边界线的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色
  • thickness:矩形边框线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状

通过该函数对检测出来的人脸进行标注,标注的方式为方框。下面将会讲到另一种标注方式(圆圈)这两种标注方式选择其中一种就OK,有关更多的OpenCV图像绘图函数,请参考如下博客连接:python-opencv绘图函数

5、cv2.circle()绘制圆圈人脸框

函数原型:cv2.circle(img,center,radius,color,thickness)

  • img:需要进行圆圈绘制的图像
  • center:圆心,即(X坐标值,Y坐标值)
  • radius:半径
  • color:绘制的圆圈的边界线的颜色。对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色
  • thickness:矩形边框线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状

该函数为圆圈标注函数,在图像中通过圆圈的方式在原图像上绘制出检测出来的人脸,同样的,按照自己的需求与方框绘制函数进行选择


二、OpenCV人脸检测

在进行人脸检测的开始,我们需要注意的是,人脸检测与人脸识别是有区别的,人间检测只是将图像中的人检测出来,然后将人脸进行标注;而人脸识别除了需要将图像中的人脸检测出来,还需要识别出该图像中对应的人脸是谁,同时也标注出来,这是区别,本次博客主要讲解人脸检测,对于人脸识别将在后面博客章节进行讲解,记得关注订阅哦!

1、OpenCV实现人脸检测步骤

1)、导入OpenCV函数库并读取人脸图像

#导入函数库
import cv2
# 读取原始图像
img = cv2.imread('peng.jpg')

2)、构建联级分类器

#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')

注意联级分类器中模型的在python路径中的位置

3)、通过联级分类器的结果进行人脸检测,设置至少检测5次才算检测人脸成功

# 检查人脸 按照1.1倍放到 周围最小像素为5
face = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)

检测到的结果face包括检测到人脸的宽和高,人脸的起始位置,以图像左上角为起点,向右为x,向左为y

4)、将检测到的人脸绘制到原图,方框或者圆圈二选一

OpenCV的图像格式都是[B、G、R]格式的,也就是[蓝、绿、红],在进行矩形或者圆框设置的时候请注意

# 绘制矩形或者圆形检测人脸
for x, y, w, h in face:
    # 绘制绿色矩形人脸区域 thickness表示线的粗细
    cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
    # 绘制红色圆形人脸区域 radius表示半径
    #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)

5)、显示检测出来的人脸

# 显示图片
cv2.imshow("faceDetection", img)
# 等待显示 设置任意键退出程序
cv2.waitKey(0)

2、图像人脸检测完整代码

1)、OpenCV图像人脸检测完整代码

'''
    OpenCV人脸检测
'''
#导入函数库
import cv2
# 读取原始图像
img = cv2.imread('peng.jpg')
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# 检查人脸 按照1.1倍放到 周围最小像素为5
face = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)
for x, y, w, h in face:
    # 绘制绿色矩形人脸区域 thickness表示线的粗细
    cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
    # 绘制红色圆形人脸区域 radius表示半径
    #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
# 显示图片
cv2.imshow("faceDetection", img)
# 等待显示 设置任意键退出程序
cv2.waitKey(0)

2)、检测结果

  • 单人检测结果

《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测_第2张图片

  • 多人检测结果
    《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测_第3张图片

3)、在博客开始的时候说到,haarcascade_frontalface_default.xml模型针对的是正脸的检测,对侧脸或者是检测不出来的,这里我们测试一下,如下侧脸检测:

  • 第一张侧脸的识别:《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测_第4张图片
  • 第二张侧脸的识别:
    《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测_第5张图片

由上面我们可以得出结论,彭于晏的帅连算法都能get到,因此,彭于晏是帅的,我也是帅的,哈哈!彭于晏=帅=林君学长

正确结论:haarcascade_frontalface_default.xml人脸检测模型对正脸的识别率为95%以上,而对于侧脸的识别,与侧脸凸显的人脸面积大小和光线强度有关,也就是说,你的脸越大,用的美颜强度越强,你的侧脸对机器视觉来讲也就越帅,因为机器和算法检测到你哇!

3、视频人脸检测完整代码

1)、视频人脸检测完整代码

'''
    OpenCV视频人脸检测
'''
#导入函数库
import cv2
import numpy as np
# 加载视频
cap = cv2.VideoCapture('zhang.mp4')
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while True:
    # 按帧读取视频片段
     #flag:返回值为True和False,True和图片一起返回,当读完视频后返回False
    #frame:接受返回来的图片
    flag, frame = cap.read()
    #判断视频是否读取完
    if flag == False:
        break
    # 对每一帧图像进行灰度处理
    gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
   # 检查人脸 按照1.1倍放到 周围最小像素为5
    face = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    # 绘制矩形和圆形检测人脸
    for x, y, w, h in face:
        # 绘制绿色矩形人脸区域 thickness表示线的粗细
        cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
        # 绘制红色圆形人脸区域 radius表示半径
        #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
    # 显示图片
    cv2.imshow('video-faceDetection',frame)
    # 设置q退出键和展示频率
    if ord('q') == cv2.waitKey(2):
        break
# 释放窗口和摄像头
cv2.destroyAllWindows()
cap.release()

2)、视频人脸检测结果

4、摄像头人脸检测完整代码

摄像头人脸检测和视频人脸检测的代码基本一致,唯一区别就是将读取的视频改为读取笔记本默认摄像头,如下
1)、摄像头人脸检测完整代码

'''
    OpenCV摄像头人脸检测
'''
#导入函数库
import cv2
import numpy as np
# 参数0为加载默认摄像头
cap = cv2.VideoCapture(0)
#构建联级分类器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while True:
    # 读取视频片段
    flag, frame = cap.read()
    #判断视频是否读取完
    if flag == False:
        break
    # 对每一帧图像进行灰度处理
    gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
   # 检查人脸 按照1.1倍放到 周围最小像素为5
    face = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    # 绘制矩形和圆形检测人脸
    for x, y, w, h in face:
        # 绘制绿色矩形人脸区域 thickness表示线的粗细
        cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
        # 绘制红色圆形人脸区域 radius表示半径
        #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
    # 显示图片
    cv2.imshow('video-faceDetection',frame)
    # 设置q退出键和展示频率
    if ord('q') == cv2.waitKey(2):
        break
# 释放窗口和摄像头
cv2.destroyAllWindows()
cap.release()

2)、摄像头人脸检测结果
《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测_第6张图片

都说了 彭于晏=帅=我,非要不相信,现在相信了吧!

以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!

不经历星期一上午的崩溃,就不知道星期五下午的可贵。

陈一月的又一天编程岁月^ _ ^

你可能感兴趣的:(Opencv视觉之眼,OpenCV人脸检测,python图像处理,《OpenCV视觉之眼》,OpenCV人脸检测模型,计算机视觉)