利用python進行識別類似圖片(二)

前言

和網上各類首先你要有一個女友的系列同樣,想進行人臉判斷,首先要有臉
只要能靠肯定人臉的位置,那麼進行兩張人臉是否類似的操做便迎刃而解了。python

因此本篇文章着重講述如何利用openCV定位人臉。git

上一篇文章的地址:github

利用python進行識別類似圖片(一)算法

安裝openCV

opencv官網ubuntu

在進行下一步操做時,咱們須要安裝openCV,原本安裝openCV的步驟跟日常安裝其餘模塊同樣,而然
因爲python的歷史緣由(用過都懂……),弄得一點都不友好。segmentfault

先說一下,python2.7的用戶,能夠直接在openCV的官網上直接下載,而後在openCV的build\python
的目錄下,根據本身的狀況,選擇x86,x64下的cv2.pyd放到你python的安裝目錄的
\Lib\site-packages\下。數組

至於python3.4的用戶,即有點特別。你能夠在StackOverFlow找到這樣
這樣的答案,但咱們不要這麼麻煩。python2.7

進入這個網站,下載openCV相關whl文件,例如
opencv_python-3.1.0-cp35-none-win_amd64.whlide

而後再對應目錄下使用pip install opencv_python-3.1.0-cp35-none-win_amd64.whl命令便可函數

安裝完成後,能夠在python的命令行下測試。

import cv2

若是沒有報錯的話,恭喜你安裝成功。

不過不管是哪一個版本的用戶,在python上使用openCV都須要先安裝numpy這個模塊。

numpy

人臉識別的原理

opencv的人臉識別是基於了haar特徵,關於什麼叫haar特徵,足以開另一篇文章說明了,礙於篇幅,這裏不作介紹。
opencv提供已經訓練好的數據寫成了xml文件,放在了opencv\sources\data\haarcascades的目錄下。

若是隻是安裝了opencv_python-3.1.0-cp35-none-win_amd64.whl的,能夠在個人github上,下載cvdata裏面的內容
,地址會在文章底部給出。

除了人臉識別的數據外,還有人眼,上半身,下半身……等人體特徵的數據,觀察xml文件的命名,不難見名知義。

接下來會介紹如何利用這個已經訓練好的數據,若是仍對haar模型感興趣,能夠參考如下地址。

zouxy09的專欄

如何使用訓練好的數據

先講關於openCV基本的一些操做。所有具體代碼,請查看個人github。

讀入一張圖片

cv2.imread(path)

若是你用type()把其返回值的類型是numpy.ndarray

而一樣,numpy.asarray(Image)返回的亦是numpy.ndarray對象,爲何強調這兩點?

  1. cv2.imread(path)不能讀取中文路徑,若路徑中含有中文字符,其會返回None

  2. 在後面的操做中,包括是切割圖片(人臉部分),再進行局部哈希,比較類似度,
    等等都是用Image對象進行操做,若是再用Image.open()讀入圖片未免顯得麻煩。

因此乾脆統一用Image.open()打開圖片,再用numpy.asarray(Image)轉化便可。

須要注意有一個不一樣的地方是雖然其返回的也是三維數組,但在第三維,即某個座標下的RGB值,兩個矩陣的順序是反的,但只要另外編寫一個小函數將其反轉便可。

載入xml數據

face_cascade = cv2.CascadeClassifier(xml_path)

將圖片灰度化

if img.ndim == 3:
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 else:
    gray = img 

# 若是img維度爲3,說明不是灰度圖,先轉化爲灰度圖gray,若是不爲3,也就是2,原圖就是灰度圖

img是以前讀入的三維數組,雖然灰度圖能夠用Image對象的convert('L')完成,但因爲不肯定
opencv的處理方法是否和該方法同樣,因此仍是用opencv本身的方法進行處理比較好。

獲取人臉座標

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, 
minSize=(10,10),flags=cv2.CASCADE_SCALE_IMAGE)
  • scale_factor:被檢測對象的尺度變化。尺度越大,越容易漏掉檢測的對象,但檢測速度加快;尺度越小,檢測越細緻準確,但檢測速度變慢。

  • min_neighbors:數值越大,檢測到對象的條件越苛刻;反之檢測到對象的條件越寬鬆;

  • minSize:檢測對象的大小

該方法返回的是一個列表,每一個列表元素是長度爲四的元組,分別臉部的左上角的x,y值,臉部區域的寬度和高度。

下一步操做

經過上述的方法,咱們就已經獲取到人臉的位置,下一步你能夠經過ImageDraw`對象進行繪圖,框出人臉的位置。

一樣,你也可使用Imagecrop方法把人臉部分提取出來,而後進行局部哈希,
經過上一篇文章說起的算法,比較二者的類似度。

兩種操做分別在個人github中實現了,請參考個人github中face1.py,和face2.py兩個python文件。

寫一隻具備識別能力的圖片爬蟲

在上一篇文章中,我說了會應用這些算法作成以只具備識別能力的圖片爬蟲,然如今我也確實是在作
但考慮到做爲核心的圖片識別和人臉識別的部分我已經寫成文章分享出來,其他部分就是想寫其餘爬蟲同樣而已,因此我決定看看這兩篇文章的反響後再決定是否繼續該系列,把圖片爬蟲的製做過程和你們分享一下。

總結

鑑於我的實力有限,本文未能詳細說明人臉識別的原理,
但總結了如何利用已經訓練好的數據進行人臉識別,但願能幫到有須要的朋友。

若有不足之處,歡迎提出。

本文涉及內容的詳細代碼在下面的github地址。

個人github倉庫

歡迎star,也歡迎給意見

本文參考文章

wphh的博客

相關文章
相關標籤/搜索