代码地址如下:
http://www.demodashi.com/demo/13071.html

前言:

OpenCV是开源的跨平台计算机视觉库,提供了Python等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

opencv中内置了基于Viola-Jones目标检测框架的Harr分类器,只需要载入一个配置文件(haarcascade_frontalface_alt.xml)就能直接调用detectObject去完成检测过程,同时也支持其他特征的检测(如鼻子、嘴巴等)。

本程序用wxPython开发GUI界面,利用OpenCv实现一个简易的猫脸识别、人脸识别器。

本程序的运行效果如下:



准备工作:

1.安装必要的第三方库:

     pip install numpy
pip install wxPython

安装PIL,在以下地址下载PIL库进行安装:

http://effbot.org/media/downloads/PIL-1.1.7.win32-py2.7.exe

(或在http://effbot.org/downloads/ 中找到与你操作系统及python版本相对应

版本的PIL)

安装OpenCv,建议在以下地址下载相应的版本进行安装:

https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

如下载了opencv_python-3.1.0-cp27-none-win32.whl;

输入:

pip install opencv_python-3.1.0-cp27-none-win32.whl

即可完成安装。

项目结构图:

整体的项目结构十分简单,一共两个脚本文件,一个是GUI界面脚本(detect_gui.py),

一个是检测器脚本(model.py);另有三个已经训练好的分类器文件,分别是检测人脸的

human_face.xml,检测人眼的human_eye.xml,检测猫脸的eye_face.xml 文件。

还有一个“face_detect-0.1-win32.msi”是根据本脚本进行编译后的可执行程序。

如下:

实现过程的部分代码展示

  1. 在model.py中导入相关的库,其实只需导入opencv库:
import cv2
  1. 加载各个分类器文件:
human_face = cv2.CascadeClassifier(r'human_face.xml')
human_eye = cv2.CascadeClassifier(r'human_eye.xml')
cat_face = cv2.CascadeClassifier(r'cat_face.xml')
  1. 编写model.py中的相关类及函数,

    用cv2.imread()函数读入图像后,需要通过cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    函数将图像转为灰度格式。

    首先用人脸分类器检出人脸区域,再在人脸区域中用人眼分类器检出人眼区域,

    同时绘制矩形框选出目标区域。

    详细代码如下:

    class Faces(object):

    def human_face(self,fileName):

    """人脸、人眼检测"""

    img = cv2.imread(fileName)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = human_face.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))

        """在目标区域绘制矩形"""
    for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = human_eye.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
    cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    return img

同理写出检测猫脸的函数:

    def cat_face(self,fileName):
"""猫脸检测"""
img = cv2.imread(fileName)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = cat_face.detectMultiScale(gray,scaleFactor= 1.02,
minNeighbors=9,
minSize=(70, 70),
flags=cv2.CASCADE_SCALE_IMAGE)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.putText(img,'Cat',(x,y-7), 3, 1.2, (0, 255, 0), 2, cv2.LINE_AA)
return img

4.在detect_gui.py中编写用户界面:

导入相关的库,从我们model.py中导入Faces类:

import wx
import os
import cv2
from collections import namedtuple
import wx.lib.rcsizer as rcs
from PIL import Image
from model import Faces

编写界面:

class MainWindow(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(600,-1))
Size = namedtuple("Size",['x','y'])
s = Size(100,50) self.human = None
self.cat = None """创建输入框"""
self.in1 = wx.TextCtrl(self,-1,size = (2*s.x,s.y))
self.in2 = wx.TextCtrl(self,-1,size = (2*s.x,s.y)) """创建按钮"""
b1 = wx.Button(self,-1,'human image')
b2 = wx.Button(self, -1, "run")
b3 = wx.Button(self,-1,'cat image')
b4 = wx.Button(self,-1,'run') """设置输入框的提示信息"""
self.in1.SetToolTipString('choose a human image')
self.in2.SetToolTipString('choose a cat image') """界面布局"""
self.sizer0 = rcs.RowColSizer()
self.sizer0.Add(b1,row = 1,col = 1)
self.sizer0.Add(self.in1,row = 1,col = 2)
self.sizer0.Add(b2,row = 1,col = 3)
self.sizer0.Add(b3,row = 2,col = 1)
self.sizer0.Add(self.in2,row = 2,col = 2)
self.sizer0.Add(b4,row = 2,col = 3) """绑定回调函数"""
self.Bind(wx.EVT_BUTTON, self.img_read, b1)
self.Bind(wx.EVT_BUTTON, self.human_face, b2)
self.Bind(wx.EVT_BUTTON, self.img_read_cat, b3)
self.Bind(wx.EVT_BUTTON, self.cat_face, b4) self.SetSizer(self.sizer0)
self.SetAutoLayout(1)
self.sizer0.Fit(self)
self.CreateStatusBar()
self.Show(True)

界面如下:

编写控件的回调函数:

    def img_read(self,evt):
"""read and show image"""
self.human = None
self.human = self.choose_file()
if self.human is None:
pass
else:
self.in1.Clear()
self.in1.write(self.human)
im = Image.open(self.human)
im.show() def img_read_cat(self,evt):
"""read and show image"""
self.cat = None
self.cat = self.choose_file()
if self.cat is None:
pass
else:
self.in2.Clear()
self.in2.write(self.cat)
im = Image.open(self.cat)
im.show() def human_face(self,evt):
if self.human is None:
self.raise_msg(u'plaese choose an image first.')
return None
else:
face = Faces()
img = face.human_face(self.human)
self.imgs_show(img,'Human face detect') def cat_face(self,evt):
if self.cat is None:
self.raise_msg(u'plaese choose an image first.')
return None
else:
face = Faces()
img = face.cat_face(self.cat)
self.imgs_show(img,'Cat face Detect')

其他注意事项:

项目文件中的“face_detect-0.1-win32.msi”是根据本脚本进行编译打包后、

可以在windows系统下独立运行的安装程序,双击该文件即可安装软件,

安装完成后,点击安装路径下的“detect_gui.exe”即可运行本软件

(即使目标PC没有安装OpenCv或Python)

如下图所示:

Python 实现的猫脸识别、人脸识别器。

代码地址如下:
http://www.demodashi.com/demo/13071.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Python 实现的猫脸识别、人脸识别器。的更多相关文章

  1. OpenCV神技——人脸检测,猫脸检测

    简介   OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 ...

  2. 简单机器学习人脸识别工具face-recognition python小试,一行代码实现人脸识别

    摘要: 1行代码实现人脸识别,1. 首先你需要提供一个文件夹,里面是所有你希望系统认识的人的图片.其中每个人一张图片,图片以人的名字命名.2. 接下来,你需要准备另一个文件夹,里面是你要识别的图片.3 ...

  3. 使用Python结合Face++ API识别人脸

    Face++是北京旷视科技旗下的视觉服务平台,可以进行人脸识别.检测等功能.其人脸识别技术据悉在目前准确率较高,其API非常友好,免费使用,功能众多,而且调用几乎没有限制.这里我使用了Python调用 ...

  4. Python使用OpenCV实现简单的人脸检测

    文章目录: OpenCV安装 安装numpy 安装opencv OpenCV使用 OpenCV测试 效果图: 注意: 图片人脸检测 程序要求: 技术实现思路 注意 本文使用的环境是:Windows+P ...

  5. 写给程序员的机器学习入门 (十一) - 对象识别 YOLO - 识别人脸位置与是否戴口罩

    这篇将会介绍目前最流行的对象识别模型 YOLO,YOLO 的特征是快,识别速度非常快

  6. 05-人脸识别-FaceNet的感性认识

    源码链接:https://github.com/davidsandberg/facenet 论文链接:https://arxiv.org/pdf/1503.03832.pdf B站大神视频解读论文:h ...

  7. 写给程序员的机器学习入门 (十) - 对象识别 Faster-RCNN - 识别人脸位置与是否戴口罩

    每次看到大数据人脸识别抓逃犯的新闻我都会感叹技术发展的太快了,国家治安水平也越来越好了

  8. python实现树莓派生成并识别二维码

    python实现树莓派生成并识别二维码 参考来源:http://blog.csdn.net/Burgess_Liu/article/details/40397803 设备及环境 树莓派2代 官方系统R ...

  9. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

随机推荐

  1. 微信支付报错:app没有获取微信支付权限

    调试微信支付的时候报错: Array( [return_code] => FAIL [return_msg] => 您没有APP支付权限) 查询了,发现自己将之前的公众号支付的APPID一 ...

  2. Visual Studio Code更改语言

    参数地址:Visual Studio Code 设置Display Language介绍 在Visual Studio Code中使用快捷键Ctrl + Shift + P可以打开命令行 在local ...

  3. (8)python 类和对象

    一.类和对象 python可以动态的添加删除变量和方法 类中的方法至少要有一个参数,第一个参数会被绑定到类的实例上,通常命名为self 1.构造函数 类中的构造方法名为 __init__(self,. ...

  4. vs2012将项目同步到github

    http://www.cnblogs.com/SmallZL/p/3637613.html 大神作品,亲测可用

  5. 第2天-css快速入门

    css是什么 css(cascading style sheet,可以译为“层叠样式表”),是一组格式设置规则,用于控制web页面的外观 如何让一个标签具有样式 第一步:必须保证引入方式正确 第二步: ...

  6. UVA 1514 Piece it together (二分图匹配)

    [题目链接] Link [题目大意] 给你一些由一块黑块和两块白块组成的L形拼图,问你是否能够拼成给出的图 [题解] 我们将所有的黑块拆点,拆分为纵向和横向,和周围的白块连边, 如果能够得到完美匹配, ...

  7. 【博弈论】【SG函数】【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) E. Game of Stones

    打表找规律即可. 1,1,2,2,2,3,3,3,3,4,4,4,4,4... 注意打表的时候,sg值不只与剩下的石子数有关,也和之前取走的方案有关. //#include<cstdio> ...

  8. 【博弈论】【SG函数】【枚举】bzoj1188 [HNOI2007]分裂游戏

    因为第i个瓶子里的所有豆子都是等价的,设sg(i)表示第i个瓶子的sg值,可以转移到sg(j)^sg(k)(i<j<n,j<=k<n)的状态. 只需要考虑豆子数是奇数的瓶子啦, ...

  9. 1.5(java学习笔记)this关键字

    this关键字主要有三个作用 1.调用本类中的属性. public class TextThis { public static void main(String[] args){ Person p1 ...

  10. Spring学习——DI(依赖注入)

    IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...