python-opencv 人脸识别

1、安装python3.6

2、安装pycharm --社区版是免费的

3、安装opencv-python、numpy 库

    

    打开file->settings

    

安装即可

同样的方法安装 numpy

4、程序讲解

import cv2
import numpy as np

导入需要的库

cap = cv2.VideoCapture(0)

使用opencv自带的VideoCapture()函数定义摄像头对象,其参数0表示第一个摄像头,一般就是笔记本的内建摄像头。此函数还可以传递一个视频,只需将参数改为视频路径,就可以打开一个视频对象。

color = (0, 255, 0)

颜色由RGB三种元素组成,在python中储存格式是元组的的形式,这是为我们接下来识别人脸并用方框圈出这一步,定义方框的颜色

classfier = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
这是一个人脸特征分类器,是社区开源的,
我们只需要打开这个人脸分类器并创建一个识别模型

while(True):
# 指定图片的人脸识别然后存储
    i = 0
    ret , img = cap.read()
    grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    if len(faceRects) > 0:  # 大于0则检测到人脸
        for faceRect in faceRects:  # 单独框出每一张人脸
            i = i + 1
            x, y, w, h = faceRect
            scr = img[x - 10 :x + w + 10 , y - 10 :y + h + 10 ]
            cv2.imwrite('img' + str(i) + '.jpg', scr)
            cv2.rectangle(img, (x , y - 10), (x + w + 10, y + h + 10), color, 3)  # 5控制绿色框的粗细

1>首先在一个while循环中不断地获取摄像头的每一帧图像
cap.read()会返回两个值ret, frame。其中ret是布尔值,如果读取帧是正确的则返回True,
如果文件读取到结尾,它的返回值就为False。
frame就是每一帧的图像,是个三维矩阵。

2>

grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

我们生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:

 C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
  • 1

参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细将
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定

在这里我们把它转化为灰度图

cv2.COLOR_BGR2GRAY:灰度图 其余的自行百度

3>
    faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))

grey:要识别的图像数据(即使不转换成灰度也能识别,但是灰度图可以降低计算强度,因为检测的依据是哈尔特征,转换后每个点的RGB数据变成了一维的灰度,这样计算强度就减少很多)

scaleFactor:图像缩放比例,可以理解为同一个物体与相机距离不同,其大小亦不同,必须将其缩放到一定大小才方便识别,该参数指定每次缩放的比例

minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏

minSize:特征检测点的最小值

4>

if len(faceRects) > 0:  # 大于0则检测到人脸
        for faceRect in faceRects:  # 单独框出每一张人脸
            i = i + 1
            x, y, w, h = faceRect
            scr = img[x - 10 :x + w + 10 , y - 10 :y + h + 10 ]
            cv2.imwrite('img' + str(i) + '.jpg', scr)
            cv2.rectangle(img, (x , y - 10), (x + w + 10, y + h + 10), color, 3)  # 5控制绿色框的粗细

返回参数是一个元组,有四个参数 x,y,w,h 

x,y是检测到的人脸的轮廓的开始坐标,

w,h是轮廓的的宽度和高度

scr = img[x - 10 :x + w + 10 , y - 10 :y + h + 10 ]
cv2.imwrite('img' + str(i) + '.jpg', scr)

利用矩阵切片把图片中的人脸轮廓截取下来并保存到工作目录中

cv2.rectangle(img, (x , y - 10), (x + w + 10, y + h + 10), color, 3)  # 5控制绿色框的粗细

要画一个长方形,我们只需要定位其起点坐标和终点坐标

cv2.imshow("face",img)

if(cv2.waitKey(47)&0xff == 27):
    break
if(cv2.waitKey(47) == ord('s')):
    cv2.imwrite('./aaa.jpg', img)
    break
(在imshow函数后面一定要有keywait函数,否则会出错)

显示图像并设置按键 按Esc退出循环

                                按S保存图像

cap.release()
cv2.destroyAllWindows()

释放资源并关闭窗口


效果图:

关注微信公众号:learner学编程

回复6.2 可得程序源码及人脸分类器XML(多种)




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值