计算机视觉相关的东西很久没有更新了,今天的专栏教大家快速实现一个静态图像人脸识别的脚本,很有意思,也很容易上手。我用的语言依旧是python,使用的库是OpenCV。
先来看一下做完的效果。
(1)脚本实现代码
import cv2
# the path of target image for face detection
imagePath = r"./image/RENLIAN.jpg"
facedetect = r"./cascades/haarcascade_frontalface_alt2.xml"
# Create the haarcascade
faceCascade = cv2.CascadeClassifier(facedetect)
# Read the image
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Detect faces in the image
faces = faceCascade.detectMultiScale(gray, 1.3,5)
# Draw a rectangle around the faces
for (x, y, w ,h) in faces:
img = cv2.rectangle(image, (x,y), (x+w, y+h), (0,255,0) , 2)
cv2.imshow("Faces found" ,image)
cv2.waitKey(0)
(2)代码讲解
facedetect = r"./cascades/haarcascade_frontalface_alt2.xml"
引入opencv自带的人脸识别的xml文件。在OpenCV中的源代码中会有一个文件夹叫做data/haarcascades, 该文件夹中包含了OpneCV中所有人脸识别的XML文件,这些文件可用于静止图像、视频和摄像头中所得到图像的人脸。
在开始做人脸识别的脚本前,把haarcascade中的xml文件拷贝到你想要项目中去,例如取一个文件名叫做cascade。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
这是将彩色的人脸图片转换成灰度图像,因为人脸检测需要这样的色彩空间。
faces = faceCascade.detectMultiScale(gray, 1.3,5)
这是检测人脸,使用的方法是detectMultiScale,传递的参数是scaleFactor和minNeighbors,分别表示人脸检测过程中每次跌代时图像的压缩率及每个人矩形保留近邻数目的最小值。
这里详讲一下这个方法的参数,detectMultiScale有6个参数。
参数1:image--待检测图片,一般为灰度图像
参数2:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数也就是每次跌代时图像的压缩率。
参数3:minNeighbors--每个人矩形保留近邻数目的最小值。
参数4: flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为 CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域
参数5、6: minSize和maxSize用来限制得到的目标区域的范围。
for (x, y, w ,h) in faces:
img = cv2.rectangle(image, (x,y), (x+w, y+h), (0,255,0) , 2)
使用rectangle画图人脸的范围(矩形)。x, y为矩形的左上角,x+w,y+h为矩形的右下角,(0,255,0)表示颜色,2表示矩形框的粗细。
结束语:这期讲的是如何用OpenCV写一个简单的人脸识别脚本,大家可以照着代码敲出来,当你看到结果那一刻你会觉得其实这东西也没啥高深的嘛,入门了以后,你自己再去找资料做一个样本训练库,提高识别的精度。