本文使用的是Anaconda(是一个开源的Python发行版本,包括IPython、Spyder等多种组件,集成了numpy、matplotlib等多种科学包)和OpenCV3.0。
使用Anaconda自带的IDE(Spyder)开发,先定义一个函数,是为检测到人脸并返回相应的坐标。需要注意的是cv2.CascadeClassifier()里面放你自己的xml文件地址。代码如下:
def detectFaces(imagePath):
img = cv2.imread(imagePath)
faceCascade = cv2.CascadeClassifier(r"D:\Software\OpenCV3.0\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml")
if img.ndim == 3:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
gray = img
faces = faceCascade.detectMultiScale(gray, 1.2, 6)
result = []
for (x,y,width,height) in faces:
result.append((x,y,x+width,y+height))
return result
拿到人脸坐标后,可以将识别出的人脸生成图片保存到定义的文件夹中。附上代码:
def savePictures(imagePath):
faces = detectFaces(imagePath)
if faces:
saveFolder = imagePath.split('.')[0]+"_faces"
os.mkdir(saveFolder)
count = 0
for (x1,y1,x2,y2) in faces:
fileName = os.path.join(saveFolder,str(count)+".jpg")
Image.open(imagePath).crop((x1,y1,x2,y2)).save(fileName)
count+=1
此外,也还可以在原图对每张人脸用矩形框标记出来,代码如下:
"""
在原图像上画矩形,标记出所有人脸。
调用Image模块的draw方法,Image.open获取图像句柄,ImageDraw.Draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即detectFaces返回的坐标),outline是矩形线条颜色(B,G,R)。
注:原始图像如果是灰度图,则去掉outline,因为灰度图没有RGB可言。
"""
def drawPictures(imagePath):
faces = detectFaces(imagePath)
if faces:
img = Image.open(imagePath)
drawInstance = ImageDraw.Draw(img)
for (x1,y1,x2,y2) in faces:
drawInstance.rectangle((x1,y1,x2,y2), outline=(255, 0,0))
img.save(imagePath.split('.')[0]+"_faces"+".jpg")