在Python语言中使用OpenCV进行人脸检测
小标 2018-11-06 来源 : 阅读 1040 评论 0

摘要:本文主要向大家介绍了在Python语言中使用OpenCV进行人脸检测,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了在Python语言中使用OpenCV进行人脸检测,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

OpenCV是如今最流行的计算机视觉库,而我们今天就是要学习如何安装使用OpenCV,以及如何去访问我们的摄像头。然后我们一起来看看写一个人脸检测程序是如何地简单,简单到只需要几行代码。
在开始之前,我假设你已经对Python有一定的了解。当然,如果你觉得你还不够格,这里有推荐一些学习Python的电子书,你可以先学习下Python,如此可以让你更好地理解接下来的步骤。另外,这里还推荐一本电子书来学习OpenCV。
好,不浪费时间,开始吧。
To setup opencv in python environment you will need these things ready ( match the versions to follow along with this tutorial),
首先我们需要先准备好这些环境(版本记得配好):

Python 2.x 
OpenCV 3 (2也行,同理
Numpy库 (这个可以在稍后用pip下载)

首先,对于下载Python,我们可以先到官网上下对应的版本,如果是Windows就可能是msi格式的版本,如果是Mac就可能是pkg格式的安装包,如果是Linux则可能是源码包。
安装和Python后打开命令行就可以使用pip命令进行Python包的安装了,如:

由于OpenCV使用Numpy库,因此先通过命令pip install numpy安装Numpy库。安装完后,尝试导入,没有报错则ok:

然后进入OpenCV官网下对应的版本并安装,尝试导入:

尝试人脸检测
万事俱备,只欠东风。我们来写代码检测人脸吧,来一发OpenCV的Hello world。
在这里我们准备使用pre-trained的XML文件,这些XML文件都较难训练,但是我们不需要担心,因此OpenCV已经为我们提供了很多人脸检测相关的pre-trained分类器。
想要使用这写分类器,我们需要将分类器的XML文件haarcascade_frontalface_default.xml从opencv文件夹/sources/data/haarcascades/下复制到我们的项目目录下,就是我们将要写程序的目录下。如果没有opencv文件夹/sources/data/haarcascades/这个目录,可以尝试找一下opencv文件夹/share/OpenCV/haarcascades/。只要找到如下文件即可:

然后如果我们要加载这个分类器的话,如此就好:
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
然后接下来我们先来测试一下摄像头吧,
cap = cv2.VideoCapture(0)
ret, img = cap.read()
cv2.imshow('windowname', img)
cv2.waitKey(0)

# 释放摄像头资源
cap.release()
以上的代码是调用你电脑的0号摄像头,并展示出来。当然,如果你有多个摄像头,那么你也可以试试别的id,修改VideoCapture函数的参数即可。
其中cap.read()就是从摄像头获取到图像,这个函数返回了两个变量,第一个为布尔值表示成功与否,以及第二个是图像。
然后程序通过imshow()展示图片,其第一个传入的参数为窗口的名称,而第二个就是要展示的图片,以上代码传入的就是我们的自拍。
而waitKey是用来停在图片的展示界面,让你看清楚,参数可以是10、100、1000等,单位是毫秒,这里填0就是一直停着。注意了,如果停留的时间不够久,就可能看不见imshow的照片了。
运行了这段代码,你将会看到摄像头所拍摄的画面,一般来说就是你自己了。

接下来我们将图片先转换为灰度图片,
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
然后就开始了人脸检测之旅:
faces = detector.detectMultiScale(gray, 1.3, 5)
以上的这句代码会等到一串list,list中的每个都有x, y, height, width四个变量。其中list表示检测到的人脸,即list的size就是人脸的个数,而每个人脸在图片中的位置是(x, y, height, width)。
为了能让我们更直观地看出来检测结果,我们将这些人脸框出来:
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

更进一步
现在我们已经通过摄像头检测到人脸了,但是我们真正需要的是不是一张静态的图片,我们需要的是一个能检测的实时动态视频流。因此我们加一个循环,然后不断的检测,最终在显示在新窗口中。
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)

while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    cv2.imshow('frame', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
需要注意的是,结尾用了waitKey和ord实现了按q退出的功能,就是每一毫秒都在检测键盘有没有按下了q,要是按下了就退出循环了。接下来就释放资源。
总结
在本文中,我们学习了如何使用Python中的OpenCV,即通过代码写了一个人脸检测的程序。我们温习或学习了这些知识点:

使用OpenCV的分类器
从摄像头中读取照片
在图片上换框框
在新窗口上展示图片
实时地进行人脸检测

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程