当前位置:首页 > 芯闻号 > 充电吧
[导读]遇到的问题:sudo apt-get install python-imaging 安装过程中提示cache size空间不足。解决:sudo apt-get clean ,然后sudo apt-ge

遇到的问题:sudo apt-get install python-imaging 

安装过程中提示cache size空间不足。

解决:sudo apt-get clean ,然后sudo apt-get update,再次使用sudo apt-get install “需要安装的文件”

@author:wepon

@blog:http://blog.csdn.net/u012162613/article/details/43523507


做人脸识别,首先要检测出图片/视频中的人脸,今天就研究了一下OpenCV的Python接口,把常用的一些功能模块写成函数。基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存、眼睛检测、笑脸检测。下面简单总结一下。


一、软件安装

安装Python-OpenCV以及其依赖库、PIL,通过软件包管理器安装即可(Ubuntu系统):


[python] view plain copy sudo apt-get install libopencv-*   sudo apt-get install python-opencv   sudo apt-get install python-imaging  


安装完后,在”/usr/share/opencv/haarcascades/”目录下,可以看到很多的xml文件,如下图。这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,推荐博文:《浅析人脸检测之Haar分类器方法》、《目标检测的图像特征提取之(三)Haar特征》。本文不阐述原理,只介绍怎么用这些xml文件来进行人脸检测。




二、python-opencv实现人脸检测


人脸检测


定义人脸检测函数detectFaces(),检测图片中所有出现的人脸,并返回人脸的矩形坐标(矩形左上、右下顶点坐标)。使用上面提到的xml文件(haar特征),haarcascades目录下有好几个是关于人脸检测的文件,这里选择haarcascade_frontalface_default.xml,当然也可以使用其他的。另外需要注意的是,必须以灰度图作为haar分类器的输入。


def detectFaces(image_name):
    img = cv2.imread(image_name)
    face_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml")
    if img.ndim == 3:
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    else:
        gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图

    faces = face_cascade.detectMultiScale(gray, 1.2, 5)#1.3和5是特征的最小、最大检测窗口,它改变检测结果也会改变
    result = []
    for (x,y,width,height) in faces:
        result.append((x,y,x+width,y+height))
    return result





代码很好理解,先加载xml文件生成级联分类器face_cascade,然后用这个级联分类器对灰度图进行检测face_cascade.detectMultiScale(gray, 1.2, 5),返回值即图片中所有人脸的坐标(x,y,w,h),在上面的函数中,我们转化了一下,使得函数返回的是人脸矩形的左上、右下顶点坐标。(注:坐标零点即原始图像左上顶点,往下y增加,往右x增加)。

 

截取保存人脸图

上面的detectFaces函数我们获得了图片中所有人脸的坐标,在有些时候,我们希望把人脸截取出来,然后进行下一步操作(比如做人脸身份识别、表情识别等),保存人脸图的函数如下,使用了PIL的Image模块:

def saveFaces(image_name):
    faces = detectFaces(image_name)
    if faces:
        #将人脸保存在save_dir目录下。
        #Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是detectFaces返回的坐标),save保存。
        save_dir = image_name.split('.')[0]+"_faces"
        os.mkdir(save_dir)
        count = 0
        for (x1,y1,x2,y2) in faces:
            file_name = os.path.join(save_dir,str(count)+".jpg")
            Image.open(image_name).crop((x1,y1,x2,y2)).save(file_name)
            count+=1

 

 

框出人脸

有些时候,为了展示或者方便观察,需要在原始图像上框出人脸,用矩形将人脸框出,这个功能的实现如下,主要用到PIL的ImageDraw模块(另外,opencv也有画矩形工具,也可以实现):

#在原图像上画矩形,框出所有人脸。
#调用Image模块的draw方法,Image.open获取图像句柄,ImageDraw.Draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即
#detectFaces返回的坐标),outline是矩形线条颜色(B,G,R)。
#注:原始图像如果是灰度图,则去掉outline,因为灰度图没有RGB可言。drawEyes、detectSmiles也一样。
def drawFaces(image_name):
    faces = detectFaces(image_name)
    if faces:
        img = Image.open(image_name)
        draw_instance = ImageDraw.Draw(img)
        for (x1,y1,x2,y2) in faces:
            draw_instance.rectangle((x1,y1,x2,y2), outline=(255, 0,0))
        img.save('drawfaces_'+image_name)

好了,先看一下效果,运行drawFaces(‘obama.jpg’),得到右图:

运行saveFaces(‘obama.jpg’),将在当前目录下生成一个文件夹,并保存上面框出来的人脸,当然,有一些人脸没被检测出来,有些不是人脸被误认为人脸。

 

 

眼睛检测

在haarcascades目录下,也有一些关于眼睛检测的xml文件。可以像函数detectFaces()那样,将检测face的xml文件换成检测eyes的xml文件即可。但是,由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detectEyes可在detectFaces基础上来进行,代码中需要注意“相对坐标”。detectEyes()函数同样返回所有eyes在原图中的坐标。

def detectEyes(image_name):
    eye_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml')
    faces = detectFaces(image_name)

    img = cv2.imread(image_name)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    result = []
    for (x1,y1,x2,y2) in faces:
        roi_gray = gray[y1:y2, x1:x2]
        eyes = eye_cascade.detectMultiScale(roi_gray,1.3,2)
        for (ex,ey,ew,eh) in eyes:
            result.append((x1+ex,y1+ey,x1+ex+ew,y1+ey+eh))
    return result

 

 

框出眼睛

def drawEyes(image_name):
    eyes = detectEyes(image_name)
    if eyes:
        img = Image.open(image_name)
        draw_instance = ImageDraw.Draw(img)
        for (x1,y1,x2,y2) in eyes:
            draw_instance.rectangle((x1,y1,x2,y2), outline=(0, 0,255))
        img.save('draweyes_'+image_name)

运行drawEyes(‘obama.jpg’),看下效果,非常差:

 

 

 

笑脸检测

def detectSmiles(image_name):
    img = cv2.imread(image_name)
    smiles_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_smile.xml")
    if img.ndim == 3:
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    else:
        gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图

    smiles = smiles_cascade.detectMultiScale(gray,4,5)
    result = []
    for (x,y,width,height) in smiles:
        result.append((x,y,x+width,y+height))
    return result

 

 

框出笑脸

def drawSmiles(image_name):
    smiles = detectSmiles(image_name)
    if smiles:
        img = Image.open(image_name)
        draw_instance = ImageDraw.Draw(img)
        for (x1,y1,x2,y2) in smiles:
            draw_instance.rectangle((x1,y1,x2,y2), outline=(100, 100,0))
        img.save('drawsmiles_'+image_name)

运行drawSmiles(‘obama.jpg’),看下效果,奥巴马的眼睛会笑了:

 

 总之,利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸(眼睛、鼻子、笑脸…)的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。剪切保存人脸以及用矩形工具框出人脸,本程序使用的是PIL里的Image、ImageDraw模块。此外也可以用opencv里的画图工具画矩形。

 

代码文件放在我的github上:wepe/OpenCV-demo/FaceDetection_python-opencv

参考:

1、OpenCV-Python Tutorials » Object Detection » Face Detection using Haar Cascades

2、 Python Imaging Library Handbook

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭