Python 實現的貓臉識別、人臉識別器。


代碼地址如下:
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)

界面如下:
GUI

編寫控件的回調函數:

    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)
如下圖所示:
start

Python 實現的貓臉識別、人臉識別器。

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

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM