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

 本文使用的是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")

你可能感兴趣的:(机器学习与机器视觉)