python人臉識別

2021-07-29 03:30:42 字數 3874 閱讀 5986

talk is cheap, show you the code!

**參考自:這裡

無注釋版:

注釋版:

# -*- coding:utf-8 -*-

import cv2

'''這裡的 cascadeclassifier 是 層級分類器 的意思。為什麼要 分層 呢?剛才提到在進行機器分析**時,其實是對整個從上到下,

從左到右,乙個畫素乙個畫素的分析,這些分析又會涉及很多的 特徵分析 ,比如對於人臉分析就包含識別眼睛,嘴巴等等,

一般為了提高分析的準確度都需要有成千上萬個特徵,這樣對於每個畫素要進行成千上萬的分析,對於整個都是百萬甚至

千萬畫素,這樣總體的計算量會是個天文數字。但是,科學家很聰明,就想到分級的理念,即把這些特徵分層,這樣分層次去

驗證,如果前面層次的特徵沒有通過,對於這個就不用判斷後面的特徵了。這樣就提高了處理的速度與效率。

'''#載入haarcascade_frontalface_default.xml這個檔案

faceclassifier=cv2.cascadeclassifier('d:/opencv2/opencv/build/share/opencv/haarcascades/haarcascade_frontalface_default.xml')

objimage=cv2.imread('test2.jpg') #讀取

'''首先將進行灰度化處理,以便於進行分析。這種方法在影象識別領域非常常見,比如在進行驗證碼的機器識別時就會先

灰度化,去除不相關的背景噪音影象,然後再分析每個畫素,以便抽取出真實的資料。不對針對此,你就看到非常多的驗證碼後

面特意新增了很多的噪音點,線,就是為了防止這種程式來灰度化進行分析破解。

'''cvtimage=cv2.cvtcolor(objimage,cv2.color_bgr2gray) #將轉為灰度圖

'''執行detectmultiscale方法來識別物體,因為我們這裡使用的是人臉的cascade classifier分類器,因此呼叫這個方法會來

進行面部識別。後面這幾個引數來設定進行識別時的配置,比如

scalefactor: 因為在拍照,尤其現在很多都是**,這樣**中有的人臉大一些因為離鏡頭近,而有些離鏡頭遠就會小一些,

因為這個引數用於設定這個因素,如果你在使用不同的**時如果人臉遠近不同,就可以修改此引數,請注意此引數必須要大於1.0

minneighbors: 因為在識別物體時是使用乙個移動的小視窗來逐步判斷的,這個引數就是決定是不是確定找到物體之前需要判斷多少個周邊的物體

minsize:剛才提到識別物體時是合作小視窗來逐步判斷的,這個引數就是設定這個小視窗的大小

'''foundfaces=faceclassifier.detectmultiscale(cvtimage,scalefactor=1.3,minneighbors=9,minsize=(50,50)) #人臉檢測

'''遍歷發現的「人臉」,需要說明的返回的是由4部分組成的位置資料,即這個「人臉」的橫軸,縱軸座標,寬度與高度。

然後使用 opencv 提供的方法在原始上畫出個矩形。其中 (0,0,255) 是使用的顏色,這裡使用的是r/g/b的顏色

表示方法,比如 (0,0,0)表示黑色,(255,255,255)表示白色,有些網頁程式設計經驗的程式設計師應該不陌生。

'''for (x,y,w,h) in foundfaces:#迴圈讀取人臉的矩形物件列表,獲得人臉矩形的座標和寬高, 然後在原中畫出該矩形框

cv2.rectangle(objimage,(x,y),(x+w,y+h),(0,0,255),2)

detectresult=str(len(foundfaces))+' faces detected'

cv2.imshow(detectresult, objimage) #顯示這個

cv2.waitkey(0)#等待使用者按下鍵盤任意乙個鍵來退出此的顯示視窗

測試樣例1test.jpg原圖:

**執行效果:

測試樣例2

再換一張:

直接使用上面的**測試的結果為:

發現檢測效果不是很好,修改如下**中的引數

foundfaces=faceclassifier.detectmultiscale(cvtimage,scalefactor=1.3,minneighbors=9,minsize=(50,50)) #人臉檢測
為:

foundfaces=faceclassifier.detectmultiscale(cvtimage,scalefactor=1.3,minneighbors=2,minsize=(50,50)) #人臉檢測
再次執行效果為:

這次執行效果就很不錯了,所有人臉都可以被檢測到了。

測試樣例3

再換一張:

直接按照第乙份**執行的話,不能檢測到任何一張人臉。修改detectmultiscale函式的引數為:

foundfaces=faceclassifier.detectmultiscale(cvtimage,scalefactor=1.1,minneighbors=5,minsize=(5,5)) #人臉檢測
執行效果:

那麼可以總結,以後要使用這些**的時候,可根據的特性(人臉的大小和分布)來修改

detectmultiscale這個函式引數(可以先修改minsize後再修改minneighbors和scalefactor)來達到人臉檢測的目的。

python人臉識別

from numpy import 引入科學計算庫 import cv2 引入opencv庫 face cascade cv2.cascadeclassifier haarcascade frontalface alt.xml 載入haar特徵級聯表 img cv2.imread my.jpg 讀取...

python之人臉識別

執行準備 所需檔案 haarcascade frontalface default.xml 獲取方式 1.開啟cmd,輸入指令 pip install i cv2 2.在安裝python的目錄下面,依次開啟資料夾 lib site packages cv2 data 所需檔案就在裡面了 1.導入庫 ...

python實現人臉識別

安裝opencv pip install opencv python 基礎知識例項 載入 匯入模組 import cv2 as cv 讀取 img cv.imread tiaotiao.jpg 路徑中不能有中文,否則載入失敗 顯示cv.imshow read img img 等待鍵盤輸入 單位毫秒 ...