前提安装OpenCV
opencv解压后
将\opencv\build\python\2.7\x86\cv2.pyd文件拷贝到C:\Python27\Lib\site-packages\cv2.pyd
OpenCV
cascade把人脸检测问题分解为好几步。对于每个数据块,它都进行一个粗略、快速的检测。若通过,会再进行一个更仔细的检测,以此不断类推。该算法有
30到 50个这样的阶段,或者说
cascade。只有通过全部阶段,算法才会判断检测到人脸。这样做的好处是:大多数图形都会在头几步就产生否定反馈,算法因而不需要在它上面测试所有
6000个特征,大大节省了时间。相对于“正常流程”耗费数个小时,这可以实时实现人脸检测。
准备好测试图片以及haarcascade_frontalface_default.xml,
编写face.py
# coding:utf-8
import cv2
# 待检测的图片路径
imagepath = ('test.jpg')
#imagepath = r'./test.jpg'
# 获取训练好的人脸的参数数据,这里直接从GitHub上使用默认值
# 现在,我们创建一个 cascade,并用人脸 cascade 初始化。这把人脸 cascade
导入内存,所以它随时可以使用。记住,该 cascade 只是一个包含人脸检测数据的 XML 文件。
face_cascade =
cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
# 读取图片
image = cv2.imread(imagepath)
# 灰度转换的作用就是:转换成灰度的图片的计算强度得以降低
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 探测图片中的人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor = 1.15,
minNeighbors =
5,
minSize = (30,30),
flags =
cv2.cv.CV_HAAR_SCALE_IMAGE
)
# scaleFactor调成
1.2能去除错误检测,为每一个级联矩形应该保留的邻近个数,可以理解为一个人周边有几个人脸
#
该函数做的就是检测人脸,是代码核心部分。所以,我们来过一遍选项。DetectMultiScale函数是一个检测物体的通用函数。我们在人脸
cascade上调用它,它检测的就是人脸。第一个选
项是灰度图片。第二个是
scaleFactor。有的人脸离镜头近,会比其他人脸更大。ScaleFactor对此进行补偿。检测算法使用移动窗口来检测物体。在系统宣布检测到人脸之前,minNeighbors
会对当前其周围有多少物体进行定义。MinSize给出每个窗口的大小。我用的是这些领域的常用值。现实中,你会拿不同的值试验窗口尺寸、扩展因素等参数,直到找出最比较合适的那一个。
当该函数认为它找到一张人脸时,会返回一个矩形列表。下一步,我们会进行循环,直到它认为检测出了什么。
print "found{0}faces!".format(len(faces))
for(x,y,w,h) in faces:
#方框
#该函数返回四个值:矩形的 x和 y坐标,以及它的高和宽。我们用这些值和内置的 rectangle函数,画出矩阵
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
#圆形
#cv2.circle(image,((x+x+w)/2,(y+y+h)/2),w/2,(0,255,0),2)
cv2.imshow("Find Faces!",image)
cv2.waitKey(0)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5ycuFmc091Zz9CXu9Wbt92Yvw1cldWYtl2LcVGb5R3c3c2bsJ2Lc52YuMnah5Waz5yZtl2cvw1LcpDc0RHaiojIsJye.gif)