Python-OpenCV人脸检测(代码)

Python-OpenCV人脸检测(代码)

@author:wepon

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


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


一、软件安装

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

[python]  view plain  copy
  1. sudo apt-get install libopencv-*  
  2. sudo apt-get install python-opencv  
  3. 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分类器的输入。

<span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> detectFaces</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    img </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">imread</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    face_cascade </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="typ" style="color: rgb(152, 251, 152);">CascadeClassifier</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">"/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">if</span><span class="pln" style="color: rgb(255, 255, 255);"> img</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">ndim </span><span class="pun" style="color: rgb(255, 255, 255);">==</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">3</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        gray </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">cvtColor</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">img</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">COLOR_BGR2GRAY</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">else</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        gray </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> img </span><span class="com" style="color: rgb(135, 206, 235);">#if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图</span><span class="pln" style="color: rgb(255, 255, 255);">

    faces </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> face_cascade</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">detectMultiScale</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">gray</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">1.2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">5</span><span class="pun" style="color: rgb(255, 255, 255);">)#</span><span class="lit" style="color: rgb(205, 92, 92);">1.3</span><span class="pun" style="color: rgb(255, 255, 255);">和</span><span class="lit" style="color: rgb(205, 92, 92);">5</span><span class="pun" style="color: rgb(255, 255, 255);">是特征的最小、最大检测窗口,它改变检测结果也会改变</span><span class="pln" style="color: rgb(255, 255, 255);">
    result </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">[]</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">width</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">height</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> faces</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        result</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">append</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">width</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">height</span><span class="pun" style="color: rgb(255, 255, 255);">))</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">return</span><span class="pln" style="color: rgb(255, 255, 255);"> result</span>


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

 

  • 截取保存人脸图

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

<span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> saveFaces</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    faces </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> detectFaces</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">if</span><span class="pln" style="color: rgb(255, 255, 255);"> faces</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="com" style="color: rgb(135, 206, 235);">#将人脸保存在save_dir目录下。</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="com" style="color: rgb(135, 206, 235);">#Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是detectFaces返回的坐标),save保存。</span><span class="pln" style="color: rgb(255, 255, 255);">
        save_dir </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> image_name</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">split</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">'.'</span><span class="pun" style="color: rgb(255, 255, 255);">)[</span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pun" style="color: rgb(255, 255, 255);">]+</span><span class="str" style="color: rgb(255, 160, 160);">"_faces"</span><span class="pln" style="color: rgb(255, 255, 255);">
        os</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">mkdir</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">save_dir</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        count </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> faces</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
            file_name </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> os</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">path</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">join</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">save_dir</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">str</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">count</span><span class="pun" style="color: rgb(255, 255, 255);">)+</span><span class="str" style="color: rgb(255, 160, 160);">".jpg"</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
            </span><span class="typ" style="color: rgb(152, 251, 152);">Image</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">open</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">).</span><span class="pln" style="color: rgb(255, 255, 255);">crop</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">)).</span><span class="pln" style="color: rgb(255, 255, 255);">save</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">file_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
            count</span><span class="pun" style="color: rgb(255, 255, 255);">+=</span><span class="lit" style="color: rgb(205, 92, 92);">1</span>

 

 

  • 框出人脸

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

<span class="com" style="color: rgb(135, 206, 235);">#在原图像上画矩形,框出所有人脸。</span><span class="pln" style="color: rgb(255, 255, 255);">
</span><span class="com" style="color: rgb(135, 206, 235);">#调用Image模块的draw方法,Image.open获取图像句柄,ImageDraw.Draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即</span><span class="pln" style="color: rgb(255, 255, 255);">
</span><span class="com" style="color: rgb(135, 206, 235);">#detectFaces返回的坐标),outline是矩形线条颜色(B,G,R)。</span><span class="pln" style="color: rgb(255, 255, 255);">
</span><span class="com" style="color: rgb(135, 206, 235);">#注:原始图像如果是灰度图,则去掉outline,因为灰度图没有RGB可言。drawEyes、detectSmiles也一样。</span><span class="pln" style="color: rgb(255, 255, 255);">
</span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> drawFaces</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    faces </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> detectFaces</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">if</span><span class="pln" style="color: rgb(255, 255, 255);"> faces</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        img </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="typ" style="color: rgb(152, 251, 152);">Image</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">open</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        draw_instance </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="typ" style="color: rgb(152, 251, 152);">ImageDraw</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="typ" style="color: rgb(152, 251, 152);">Draw</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">img</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> faces</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
            draw_instance</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">rectangle</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">),</span><span class="pln" style="color: rgb(255, 255, 255);"> outline</span><span class="pun" style="color: rgb(255, 255, 255);">=(</span><span class="lit" style="color: rgb(205, 92, 92);">255</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pun" style="color: rgb(255, 255, 255);">))</span><span class="pln" style="color: rgb(255, 255, 255);">
        img</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">save</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">'drawfaces_'</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
</span>

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

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

 

 

  • 眼睛检测

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

<span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> detectEyes</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    eye_cascade </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="typ" style="color: rgb(152, 251, 152);">CascadeClassifier</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">'/usr/share/opencv/haarcascades/haarcascade_eye.xml'</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    faces </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> detectFaces</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">

    img </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">imread</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    gray </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">cvtColor</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">img</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">COLOR_BGR2GRAY</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    result </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">[]</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> faces</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        roi_gray </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> gray</span><span class="pun" style="color: rgb(255, 255, 255);">[</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> x1</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">]</span><span class="pln" style="color: rgb(255, 255, 255);">
        eyes </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> eye_cascade</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">detectMultiScale</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">roi_gray</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">1.3</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">2</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">ex</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">ey</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">ew</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">eh</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> eyes</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
            result</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">append</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">ex</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">ey</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">ex</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">ew</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">ey</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">eh</span><span class="pun" style="color: rgb(255, 255, 255);">))</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">return</span><span class="pln" style="color: rgb(255, 255, 255);"> result</span>

 

 

  • 框出眼睛
<span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> drawEyes</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    eyes </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> detectEyes</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">if</span><span class="pln" style="color: rgb(255, 255, 255);"> eyes</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        img </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="typ" style="color: rgb(152, 251, 152);">Image</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">open</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        draw_instance </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="typ" style="color: rgb(152, 251, 152);">ImageDraw</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="typ" style="color: rgb(152, 251, 152);">Draw</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">img</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> eyes</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
            draw_instance</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">rectangle</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">),</span><span class="pln" style="color: rgb(255, 255, 255);"> outline</span><span class="pun" style="color: rgb(255, 255, 255);">=(</span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">255</span><span class="pun" style="color: rgb(255, 255, 255);">))</span><span class="pln" style="color: rgb(255, 255, 255);">
        img</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">save</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">'draweyes_'</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span>

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

 

 

 

  • 笑脸检测
<span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> detectSmiles</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    img </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">imread</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    smiles_cascade </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="typ" style="color: rgb(152, 251, 152);">CascadeClassifier</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">"/usr/share/opencv/haarcascades/haarcascade_smile.xml"</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">if</span><span class="pln" style="color: rgb(255, 255, 255);"> img</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">ndim </span><span class="pun" style="color: rgb(255, 255, 255);">==</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">3</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        gray </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">cvtColor</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">img</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> cv2</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">COLOR_BGR2GRAY</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">else</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        gray </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> img </span><span class="com" style="color: rgb(135, 206, 235);">#if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图</span><span class="pln" style="color: rgb(255, 255, 255);">

    smiles </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> smiles_cascade</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">detectMultiScale</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">gray</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">4</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">5</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    result </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">[]</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">width</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">height</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> smiles</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        result</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">append</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">width</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">height</span><span class="pun" style="color: rgb(255, 255, 255);">))</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">return</span><span class="pln" style="color: rgb(255, 255, 255);"> result
</span>

 

 

  • 框出笑脸
<span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">def</span><span class="pln" style="color: rgb(255, 255, 255);"> drawSmiles</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">):</span><span class="pln" style="color: rgb(255, 255, 255);">
    smiles </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> detectSmiles</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
    </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">if</span><span class="pln" style="color: rgb(255, 255, 255);"> smiles</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
        img </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="typ" style="color: rgb(152, 251, 152);">Image</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">open</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        draw_instance </span><span class="pun" style="color: rgb(255, 255, 255);">=</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="typ" style="color: rgb(152, 251, 152);">ImageDraw</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="typ" style="color: rgb(152, 251, 152);">Draw</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">img</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);">
        </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">for</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">)</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="kwd" style="color: rgb(240, 230, 140); font-weight: bold;">in</span><span class="pln" style="color: rgb(255, 255, 255);"> smiles</span><span class="pun" style="color: rgb(255, 255, 255);">:</span><span class="pln" style="color: rgb(255, 255, 255);">
            draw_instance</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">rectangle</span><span class="pun" style="color: rgb(255, 255, 255);">((</span><span class="pln" style="color: rgb(255, 255, 255);">x1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y1</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">x2</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);">y2</span><span class="pun" style="color: rgb(255, 255, 255);">),</span><span class="pln" style="color: rgb(255, 255, 255);"> outline</span><span class="pun" style="color: rgb(255, 255, 255);">=(</span><span class="lit" style="color: rgb(205, 92, 92);">100</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="pln" style="color: rgb(255, 255, 255);"> </span><span class="lit" style="color: rgb(205, 92, 92);">100</span><span class="pun" style="color: rgb(255, 255, 255);">,</span><span class="lit" style="color: rgb(205, 92, 92);">0</span><span class="pun" style="color: rgb(255, 255, 255);">))</span><span class="pln" style="color: rgb(255, 255, 255);">
        img</span><span class="pun" style="color: rgb(255, 255, 255);">.</span><span class="pln" style="color: rgb(255, 255, 255);">save</span><span class="pun" style="color: rgb(255, 255, 255);">(</span><span class="str" style="color: rgb(255, 160, 160);">'drawsmiles_'</span><span class="pun" style="color: rgb(255, 255, 255);">+</span><span class="pln" style="color: rgb(255, 255, 255);">image_name</span><span class="pun" style="color: rgb(255, 255, 255);">)</span>

运行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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值