人脸检测常见方式---视频,图片


前言

寒假放假了,在家太无聊。学着写个人脸检测玩玩。。


提示:以下是本篇文章正文内容,下面案例可供参考

一、opencv是什么?

OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。
总而言之,我们需要用到opencv里面的库进行人脸检测。另外,如果你没有安装,还需要先安装。

conda install opencv-python

二、人脸检测—摄像头版

1.引入库

代码如下:

import cv2

2.具体代码

代码如下:

import cv2

#人脸检测---摄像头版
def video_demo():
    capture=cv2.VideoCapture(0) #参数为0,表示默认摄像头

    while(True):
        #读取摄像头里的内容
        ret,frame=capture.read() #返回ret和frame,ret表示有没有抓取到图片,frame代表一帧图片
        frame=cv2.flip(frame,1) #对图像进行翻转,0代表垂直,1代表水平,-1代表垂直水平
        #显示每一帧
        face_patterns=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml') #是一个分类器,有haar和lbp两种特征;自带人脸检测器
        #人脸检测函数,frame是图片,scaleFactor表示从minSize开始,每次窗口扩大10%知道默认最大值;minNeighbor表示一个物体最少多少标记认为是人脸
        faces=face_patterns.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4,minSize=(100,100)) #返回值为左上角坐标以及长和宽
        print(faces)
        for(x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #在图像上绘制矩形 (x,y)左上坐标,(x+w,y+h)右下坐标,(0,255,0)颜色,2矩阵厚度
        cv2.imshow("jiemain",frame) #图形界面一闪而过
        c = cv2.waitKey(1)  # 延迟,来保证图片显示
        if c == 27:
            break

video_demo()

3.解析

face_patterns=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml')  #是一个分类器,有haar和lbp两种特征;自带人脸检测器

opencv中有一个分类器CascadeClassifier,在这个分类器里面有很多已经训练好的检测模型,不仅有关于脸的,还有鼻子,眼睛,身体等等。(在文章结尾附上链接)

faces=face_patterns.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4,minSize=(100,100))

detectMultiScale是分类下的一个检测器,里面的参数以及返回结果会稍微难懂一点,但是不用担心我会尽可能简单描述出来。
frame:代表要检测的图片;
scaleFactor:代表每次检测范围扩大10%;(这个要和minSize一起理解)
minSize:代表最初检测时范围大小;(此处设置为100x100)
scaleFactor 就是从第一次在minSize规定大小上每次扩大10%扫描范围,直到大于macSize值为止
minNeighbors:代表最小邻居个数,他的值直接关系你检测的质量。
当minNeighbors为0时,代表它只要检测出一个符合模型特征的就判定为正确结果,而这样做的代价就是它会有很多个结果,此时的结果质量并不高;当minNeighbors为3时,代表当在临近区域至少有三个检测结果时,才判定为正确检测结果,此时的检测质量相比之前大大提升。
这个minNeighbors为0时
在这里插入图片描述
这个minNeighbors为3时
在这里插入图片描述

for(x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #在图像上绘制矩形 (x,y)左上坐标,(x+w,y+h)右下坐标,(0,255,0)颜色,2矩阵厚度
        cv2.imshow("jiemain",frame) #图形界面一闪而过
        c = cv2.waitKey(1)  # 延迟,来保证图片显示

这段代码主要是用来绘制长方形边框,当然你也可以绘制圆形边框,后面关于图片检测会使用圆形边框。
这里主要注意两点:
1,imshow的两个参数都不能少;
2,imshow的作用是展示一个图形界面,但是每一帧都非常快,如果没有后面的waitkey,你只能看见一个黑色边框,后面的waitkey是用来延迟展示,1代表延迟一毫秒,0代表无限制延迟。


# 三、人脸检测---图片版 ## 1.引入库

代码如下:

import cv2

2.具体代码

代码如下:

import sys

import cv2
# imagepath='C:\\Users\\Administrator\\Desktop\\huren.jpeg'
imagepath='C:\\Users\\Administrator\\Desktop\\zhao.jpeg'
def picture_demo():
    image=cv2.imread(imagepath) #需要sys才能使用路径
    image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

    face_pattern=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml')
    faces=face_pattern.detectMultiScale(image_gray,scaleFactor=1.1,minNeighbors=4,minSize=(100,100))
    print(faces)
    for (x,y,w,h) in faces:
        cv2.circle(image,(int((x+x+w)/2),int((y+y+h)/2)),int(w/2),(0,0,255),2) #需要整型,不能使用浮点型
    cv2.imshow("picture",image) #两个参数都能少
    cv2.waitKey(0) #0表示无限制等待
picture_demo()

3.解析

image=cv2.imread(imagepath) #需要sys才能使用路径
image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

这里相较于上面,我们需要导入图片,并且将图片进行灰度处理

face_pattern=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml')
faces=face_pattern.detectMultiScale(image_gray,scaleFactor=1.1,minNeighbors=4,minSize=(100,100))

这里的解释与上面相同,这里不再赘述

for (x,y,w,h) in faces:
        cv2.circle(image,(int((x+x+w)/2),int((y+y+h)/2)),int(w/2),(0,0,255),2) #需要整型,不能使用浮点型

这里就是上面提到的进行圆框检测

4.结果展示

在这里插入图片描述

总结

整体来说不是很难,大家可以动手试试玩一玩。以前经常刷到上班摸鱼,使用人脸识别自动切屏的视频,下一篇文章准备学着做一个人脸识别。。。。

识别器模型
https://pan.baidu.com/s/1fWuFDlWhYFXA6OjEQQcaUw
提取码:0mrr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值