首页 > 编程语言 >opencv-python 人脸人眼检测

opencv-python 人脸人眼检测

时间:2023-08-10 22:34:02浏览次数:36  
标签:eye img python cv2 face 分类器 opencv 人脸

人脸检测:在一张图像中判断是否存在人脸并找出人脸所在的位置。

人脸识别:在人脸检测的基础上收集人脸数据集合进行处理保存信息,将输入人脸与保存的信息进行比对校验,得到是否为其中某个人脸。

特征值:以某种特定规则对输入源进行处理得到具有唯一性质量化的值,在人脸识别中特征值的提取有:HOG--方向梯度直方图;HAAR--like特征;LBP--局部二进制模式。

分类器:根据特征值界定输入事物是否属于已知某种类别的过滤条件组合,未知类别的是聚类器。弱分类器:分类器的正确率高于50%,强分类器:能满足预期分类并且正确率很高的分类器。

Adaboost:迭代算法,同一个训练集合下训练多个弱分类器,把弱分类器迭代组合成一个强分类器。

级联分类器:将多个同类型的分类器联合起来进行推算整合以得到符合目标的最终分类器的方法。

分类器生成及使用

一个高准确率的级联分类器的主要生成步骤如下:

1.大量样本集合,特征值的提取。

2.通过adaboost训练多个弱分类器并迭代为强分类器。

3.多层级联强分类器,得到最终的级联分类器。

这些训练流程完成之后结果以xml的方式保存起来,opencv中包含了以上的实现,并且已经存放了很多训练好的不同类型的级联分类器。

opencv中可以通过API直接加载这些分类器文件。

CascadeClassifier(级联分类器)

检测人脸或人眼的函数:detectMultiScale()

参数1:image--待检测图片,一般为灰度图片加快检测速度。

参数2:objects--被检测物体的矩形框向量组。

参数3:scaleFactor--前后两次相继的扫描中,图像被缩放的比例,1.1即每次被缩放10%用于检测。

参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认3个)

参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,设置成后面这个函数会使用canny边缘检测来排除边缘过多或过少的区域。

参数6/7:minsize和mzxsize用来限制得到的目标区域的范围。

opencv的各种级联分类器保存在data目录下:

直接调用cv的级联分类器进行人脸和人眼的检测如下(图片来源于百度):

import cv2
import numpy as np

img = cv2.imread('./mans.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
equalize = cv2.equalizeHist(gray)


#创建人脸级联分类器
face = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
#创建眼睛级联分类器
eye = cv2.CascadeClassifier('./haarcascade_eye.xml')

#开始检测
faces = face.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=4) #存放每个人脸框的位置,ndarray
eyes = eye.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3)

print(type(faces))
print(faces)

for face in faces:
    (x,y,w,h) = face
    cv2.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)

for eye in eyes:
    (x,y,w,h) = eye
    cv2.rectangle(img,(x,y),(x+w,y+h),[0,255,0],2)
    
    
cv2.imshow('img',img)
# cv2.imshow('gray',gray)
# cv2.imshow('equalize',equalize)

cv2.waitKey(0)
cv2.destroyAllWindows()

 相比于检测人脸,人眼的检测更容易出错,有误检的可能,所有可以在人脸框里面进行人眼检测:

import cv2
import numpy as np   #只在人脸框内进行眼睛检测

img = cv2.imread('./mans.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
equalize = cv2.equalizeHist(gray)

#创建人脸级联分类器
face = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
# eye = cv2.CascadeClassifier('./haarcascade_eye.xml')

faces = face.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=4) #存放每个人脸框的位置,ndarray
# eyes = eye.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3)

for face in faces:
    (x,y,w,h) = face 
    cv2.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
    face_img = img[y:y+h,x:x+w]   #把检测处理的人脸框切片出来
    
    eye = cv2.CascadeClassifier('./haarcascade_eye.xml') #创建眼睛级联分类器
    eyes = eye.detectMultiScale(face_img)  #在人脸切片图片上检测眼睛
    
    for eye in eyes:
        (ex,ey,ew,eh) = eye
        cv2.rectangle(face_img,(ex,ey),(ex+ew,ey+eh),[0,255,0],2)  ##在人脸切片图片上框出眼睛,face_img已经修改
        img[y:y+h,x:x+w] = face_img    #把框出眼睛的人脸切片图片贴到img上去

cv2.imshow('img',img)
# cv2.imshow('gray',gray)
# cv2.imshow('equalize',equalize)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

  

 

标签:eye,img,python,cv2,face,分类器,opencv,人脸
From: https://www.cnblogs.com/libai123456/p/17618614.html

相关文章

  • opencv-python 视频前后景分离
    背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术。BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态部分,或者更一般而言,考虑到所观察场景的特征,可以将其视为背景的所有内容。前后景分离分为两步:第一步......
  • opencv-python 视频处理
    视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示一秒钟显示30张图片。opencv中可以用 VideoCapture来捕获摄像头,用数字表示不同的设备,比如0,1。如果是视频文件,直接指定路径即可。VideoCapture类提供了初始化,打开视频文件或设备,视频帧捕获,视频文件或设备关闭,属性设......
  • python猜数字小游戏
    importrandomdefguess_number():  target_number=random.randint(1,100)  attempts=0  whileTrue:    guess=int(input("请输入一个1到100之间的整数:"))    attempts+=1    ifguess<target_number:      print("猜......
  • [oeasy]python0083_[趣味拓展]字体样式_正常_加亮_变暗_控制序列
    字体样式回忆上次内容上次了解了一个新的转义模式\033逃逸控制字符escesc退出标准输出流进行控制信息的设置可以清屏也可以设置光标输出的位置还能做什么呢?可以设置字符的颜色吗???......
  • [oeasy]python0083_[趣味拓展]字体样式_正常_加亮_变暗_控制序列
    字体样式回忆上次内容上次了解了一个新的转义模式\033逃逸控制字符esc esc让输出退出标准输出流进行控制信息的设置可以清屏也可以设置光标输出的位置  还能做什么呢?可以设置字符的颜色吗???......
  • Python基础day63Django操作session和中间件使用
    Django操作cookie#设置cookie#获取cookieset_cookie('key','value',max_age=5,expires=5)参数:●key,键●value=’’,值●max_age=None,超时时间cookie需要延续的时间(以秒为单位)如果参数是\None``,这个cookie会延续到浏览器关闭为止expires=None,超时时间(......
  • Python模块之paramiko的基本使用
    简介paramiko是一个基于SSHv2协议的纯Python(2.7,3.4+)库;提供了客户端和服务器的功能;可以实现SSH2远程安全连接,支持认证和密钥方式;一般用于执行远程命令、传输文件、中间SSH代理等。paramiko可以在Python代码中直接使用SSH协议对远程服务器进行操作,而不是调用ssh命令对远程服......
  • C#实现PS曲线调整,OpenCV实现
    曲线原理 对于一个RGB图像, 可以对R, G, B通道进行独立的曲线调整,即,对三个通道分别使用三条曲线(Curve)。还可以再增加一条曲线对三个通道进行整体调整。 因此,对一个图像,可以用四条曲线调整。最终的结果,是四条曲线调整后合并产生的结果。比如:对红色通道定义一条曲线如下......
  • 分享之python 协程
    线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。协程的适用场景:当程序中存在大......
  • 软件测试|什么是Python构造方法,构造方法如何使用?
    构造方法(Constructor)是面向对象编程中的重要概念,它在创建对象时用于初始化对象的实例变量。在Python中,构造方法是通过特殊的名称__init__()来定义的。本文将介绍Python构造方法的基本概念、语法和用法。什么是构造方法?在面向对象编程中,构造方法是一个特殊的方法,用于在创建对象时初......