Python2.7 & OpenCV3.0实现人脸检测的简单实例

来源:互联网 发布:淘宝男模特收入 编辑:程序博客网 时间:2024/06/10 22:18
 本文使用的是Anaconda(是一个开源的Python发行版本,包括IPython、Spyder等多种组件,集成了numpy、matplotlib等多种科学包)和OpenCV3.0。 使用Anaconda自带的IDE(Spyder)开发,先定义一个函数,是为检测到人脸并返回相应的坐标。需要注意的是cv2.CascadeClassifier()里面放你自己的xml文件地址。代码如下:
def detectFaces(imagePath):    img = cv2.imread(imagePath)    #加载openCV自带的人脸检测级联分类器配置文件haarcascade_frontalface_default.xml    faceCascade = cv2.CascadeClassifier(r"D:\Software\OpenCV3.0\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml")    #此处报错Nonetype object has no attribute ndim表示imread()没有读到图片    #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图    if img.ndim == 3:        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    else:        gray = img     faces = faceCascade.detectMultiScale(gray, 1.2, 6)#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:        #将人脸保存在save_dir目录下。        #Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是detectFaces返回的坐标),save保存。        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")