在Python中使用OpenCV进行人脸检测

OpenCV介绍

     OpenCV是如今最流行的计算机视觉库,

学习目标

  • 我们今天就是要学习如何安装使用OpenCV 。
  • 如何去访问我们的摄像头 。
  • 我们一起来写一个人脸检测程序是如何地简单,简单到只需要几行代码 。

安装opencv

1. 我们需要先准备好这些环境(版本记得配好):

  • Python 2.x  
  • OpenCV 3 (2也可以)

2. Numpy库 (这个可以在稍后用pip下载)

  • 下载Python:我们可以先到官网上下对应的版本 。
  • 版本信息:Windows是msi格式的版本,如果是Mac就可能是pkg格式的安装包,如果是Linux则可能是源码包。
  • 安装和Python后打开命令行用pip验证是否安装成功,如下图表示成功:

由于

Numpy库的安装

  • OpenCV需要使用Numpy库 。
  • 安装Numpy库的命令:pip install numpy
  • 安装Numpy库。安装完后,尝试导入,没有报错则ok:
  • 然后进入OpenCV官网下对应的版本并安装,尝试导入:

 

尝试人脸检测

我们来写代码检测人脸吧,来一发OpenCV的Hello world。

在这里我们准备使用pre-trained(分类器)的XML文件,这些XML文件都较难训练,但是我们不需要担心,因此OpenCV已经为我们提供了很多人脸检测相关的pre-trained(分类器)。

想要使用这写分类器,我们需要将分类器的XML文件haarcascade_frontalface_default.xmlopencv文件夹/sources/data/haarcascades/下复制到我们将要写程序的目录下。

如果没有opencv文件夹/sources/data/haarcascades/这个目录,可以去opencv文夹/share/OpenCV/haarcascades/

只要找到如下文件即可:

 

然后我们需要加载这个分类器:

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

然后接下来我们先来测试一下摄像头吧,

 
  1. # 1. 捕获电脑的第一个摄像头

  2. cap = cv2.VideoCapture(0)

  3. # 2. 读取这个摄像头,并截获图片。

  4. ret, img = cap.read()

  5. # 3. 展示截获的图片

  6. cv2.imshow('windowname', img)

  7.  
  8. cv2.waitKey(0)

  9.  
  10. # 4.释放摄像头资源

  11. cap.release()

以上的代码简述:

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

图片结果:运行了这段代码,你将会看到摄像头所拍摄的画面,一般来说就是你自己了。

 

图片处理

图片画面处理方法:

cvtColor() :灰度处理单个图片 。
cvtColorTwoPlane() :灰度处理两个图片 。

假设将图片先转换为灰度图片,

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)。

为了能让我们更直观地看出来检测结果,我们将这些人脸框出来:

 
  1. for (x, y, w, h) in faces:

  2. cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

更进一步

现在我们已经通过摄像头检测到人脸了,但是我们真正需要的是不是一张静态的图片,我们需要的是一个能检测的实时动态视频流。因此我们加一个循环,然后不断的检测,最终在显示在新窗口中。

 
  1. detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

  2. cap = cv2.VideoCapture(0)

  3.  
  4. while True:

  5. ret, img = cap.read()

  6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  7. faces = detector.detectMultiScale(gray, 1.3, 5)

  8. for (x, y, w, h) in faces:

  9. cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

  10.  
  11. cv2.imshow('frame', img)

  12. if cv2.waitKey(1) & 0xFF == ord('q'):

  13. break

  14.  
  15. cap.release()

  16. cv2.destroyAllWindows()

需要注意的是,结尾用了waitKey和ord实现了按q退出的功能,就是每一毫秒都在检测键盘有没有按下了q,要是按下了就退出循环了。接下来就释放资源。

总结

在本文中,我们学习了如何使用Python中的OpenCV,即通过代码写了一个人脸检测的程序。我们温习或学习了这些知识点:

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

 

 

转载需声明出处:

https://blog.youkuaiyun.com/weixin_42170439/article/details/90718710

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值