1. 程式人生 > >Python + OpenCV 實現簡單的人臉識別

Python + OpenCV 實現簡單的人臉識別

前言

人臉識別,是基於人的臉部特徵資訊進行身份識別的一種生物識別技術。用攝像機或攝像頭採集含有人臉的影象或視訊流,並自動在影象中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部的一系列相關技術,通常也叫做人像識別、面部識別。
———-摘自百度百科

說明

環境:Ubuntu16.04
語言: Python
依賴:OpenCV+matplotlib

載入人臉模型

在我們安裝OpenCV好以後,在目錄下會有很多的xml檔案。那些檔案就是訓練好的haar特徵(我也不曉得哈兒特徵怎麼來的,剛開始會用裡面的人臉,耳朵,眼睛等特徵就好)模型。
這裡寫圖片描述
這裡的模型是xml檔案,opencv先載入模型,在通過模型去提取人臉區域,核心方法為:cv2.CascadeClassifier()

# 預設值
# 這個xml是人臉模型
model_face = '/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml'

## face model
def get_model_type(model_name)
:
if not(model_face): return cv2.CascadeClassifier(model_face) return cv2.CascadeClassifier(model_name)

核心(提取特徵區域)

使用載入好的模型去提取影象中可能存在的人臉區域,返回一個臉部區域faces集合(人臉矩形的左上、右下頂點座標),faces記錄了人臉的相對位置(x,y,width,height)。核心函式:detectMultiScale()

    face_cascade = get_model_type(face_model) #載入模型
print image_name img = cv2.imread(image_name) # 讀取圖片 min_h = int(max(img.shape[0] / min_height_dec, min_height_thresh)) min_w = int(max(img.shape[1] / min_width_dec, min_width_thresh)) if img.ndim == 3: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 轉灰度 else: gray = img # 核心中的核心 faces = face_cascade.detectMultiScale(gray, 1.3, minNeighbors=5, minSize=(min_h, min_w))

如果存在的話,這樣就可以找到了

標記儲存

所謂標記就是在人臉區域框出來,再儲存文即可。

## 畫框
def draw_rect(img, x, y, w, h):
        upper_cut = [min(img.shape[0], y + h + FACE_PAD), min(img.shape[1], x + w + FACE_PAD)]
        lower_cut = [max(y - FACE_PAD, 0), max(x - FACE_PAD, 0)]
        cv2.rectangle(img, (lower_cut[1], lower_cut[0]), (upper_cut[1], upper_cut[0]), (255, 0, 0), 2)


 for (x, y, width, height) in faces:
        result.append((x, y, x + width, y + height))
        draw_rect(img, x, y, width, height)  # 畫線標記

畫框完以後,就是儲存了, 怎麼儲存就不說了,如果不會就看這篇文章 影象處理行業專業級類庫OpenCV

結束語

先上個圖片(說明:圖片來源於百度)
這裡寫圖片描述
這裡寫圖片描述
上午試了這個例子,感覺還是挺簡單的,當然這是最基本的使用,真正使用的時候遠遠不止這麼簡單,光一個特徵模型訓練就得花好的力氣,做深度學習的我深有體會;可以說人臉模型就是可以說是一種規則,或者多種規則,人臉識別就是用這個規則去套影象。
示例程式碼連結github

參考文章