图像识别 python+opencv的简单人脸识别

来源:互联网 发布:笨方法学python pdf 编辑:程序博客网 时间:2024/06/10 01:06

#
源码如下:

#!/usr/bin/env python#coding=utf-8import osfrom PIL import Image, ImageDrawimport cvdef detect_object(image):    '''检测图片,获取人脸在图片中的坐标'''    grayscale = cv.CreateImage((image.width, image.height), 8, 1)    cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)    cascade = cv.Load("/opt/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml")    rect = cv.HaarDetectObjects(grayscale, cascade, cv.CreateMemStorage(), 1.1, 2,        cv.CV_HAAR_DO_CANNY_PRUNING, (20,20))    result = []    for r in rect:        result.append((r[0][0], r[0][1], r[0][0]+r[0][2], r[0][1]+r[0][3]))    return resultdef process(infile):    '''在原图上框出头像并且截取每个头像到单独文件夹'''    image = cv.LoadImage(infile);    if image:        faces = detect_object(image)    im = Image.open(infile)    path = os.path.abspath(infile)    save_path = os.path.splitext(path)[0]+"_face"    try:        os.mkdir(save_path)    except:        pass    if faces:        draw = ImageDraw.Draw(im)        count = 0        for f in faces:            count += 1            draw.rectangle(f, outline=(255, 0, 0))        drow_save_path = os.path.join(save_path,"out.jpg")        im.save(drow_save_path, "JPEG", quality=80)    else:        print "Error: cannot detect faces on %s" % infileif __name__ == "__main__":    process("/Users/zhangdebin/Documents/checkFace2.jpg")

示例图片1:
checkFace1.jpg
识别结果
可以看出,对于比较干净的人脸头像,使用opencv库haarcascade_frontalface_alt_tree.xml的识别精度很高(这张达到了100%),同时,对于表情变化的人脸也有很强的鲁棒性。
示例图片2:
checkFace2.jpg
识别结果
但是,对于上传的比较随意的头像照片,比如示例图片2这些有帽子、眼镜遮挡的人脸图片,识别效果就会很差,本组只有唯一一个没有帽子遮挡的人脸被识别成功

本次只是简单的测试了下,python使用opencv库的人脸特征进行人脸识别的效果,仅供初学参考。

0 0
原创粉丝点击