1. 程式人生 > >OpenCv之人臉識別

OpenCv之人臉識別

準備:

1、匯入庫

編寫訓練程式首先需要做的是匯入相關的庫

1、匯入OpenCv庫
2、匯入os庫,用於檔案處理
3、匯入numpy庫,用於計算
4、匯入pillow庫,用於影象處理(好像沒有用到)

其實就是這樣:

import cv2 
import os 
import numpy as np 
from PIL import Image

現在我們初始化人臉檢測器和人臉識別器(初始化,尚不具備人臉識別功能):

detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml"
) recognizer = cv2.face.LBPHFaceRecognizer_create() # 有可能是 recognizer = cv2.createLBPHFaceRecognizer()

注意:
自己使用cv2.face.LBPHFaceRecognizer_create()的時候,出現了問題,找不到對應的庫,此時需要安裝一個庫
程式碼如下:pip install opencv_contrib_python
但是但是還是有問題
經過百度,需要以管理員身份開啟cmd
然後通過pip install --user opencv_contrib_python的方式才能安裝成功

2、載入訓練資料

現在我們來建立一個函式,用於從資料集資料夾中獲取訓練圖片,然後從圖片的檔名中獲取到這個素材相應的id。需要remind的是,根據前文,圖片的格式是id.samplenumber
比如有一張圖片的id是6,id為6的圖片有3個,那麼這三張圖片命名就是6.1.jpg,6.2.jpg,6.3.jpg。當然這個圖片格式不一定是jpg,也可能是png。
定義一個函式:

(1) 匯入所有圖片及對應的id:

獲取所有圖片路徑
如果圖片都在path資料夾下
image_paths=[os.path.join(path, f) for f in os.listdir(path)]


新建兩個list用於存放:

 face_samples = []
 ids = []

遍歷圖片路徑,匯入圖片和id,新增到list:

    for image_path in image_paths:
        image = Image.open(image_path).convert('L')
        image_np = np.array(image, 'uint8')
        # if os.path.split(image_path)[-1].split(".")[-1] != 'pgm':
        #     continue
        image_id = int(os.path.split(image_path)[-1].split(".")[0])
        faces = detector.detectMultiScale(image_np)
        for (x, y, w, h) in faces:
            face_samples.append(image_np[y:y + h, x:x + w])
            ids.append(image_id)

以上程式碼,使用了Image.open(image_path).convert(‘L’)通過圖片路徑並將其轉換為灰度圖片。
接下來我們通過image_np = np.array(image, 'uint8')將圖片轉換成了Numpy陣列,Numpy陣列的邏輯結構和普通的陣列無異,但是是經過優化的。
為了獲取到id,我們將圖片的路徑分裂一下並獲取相關資訊,即image_id = int(os.path.split(image_path)[-1].split(".")[0])
接下來的一個迴圈for (x, y, w, h) in faces則是將圖片和id都新增在list中。
再return一下即可。

3、訓練

差不多完成了,現在我們呼叫一下這個函式,然後將我們的資料餵給識別器去訓練吧。

faces, Ids = get_images_and_labels('dataSet')
recognizer.train(faces, np.array(Ids)) 
recognizer.save('trainner/trainner.yml')

這個yml檔案,存著我們的訓練好的資料,以後識別會用到的。

4、測試(進行人臉識別)

載入人臉檢測器(分類器)

cascade_path = "haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)

載入人臉識別器

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainner/trainner.yml') 

獲取攝像頭的控制物件

cam = cv2.VideoCapture(0)
# 這裡的引數可能是-1  0  1

載入一個字型,用於在識別後,在圖片上標註出識別物件的名字:

font = cv2.FONT_HERSHEY_SIMPLEX

人臉識別主程式:

在程式的主迴圈中,我們需要做的是:

1. 從攝像頭中獲取影象
2. 將影象轉換為灰度圖片
3. 在圖片中檢測人臉
4. 用識別器識別該人的id
5. 將識別出人臉的id或名稱用矩形在圖片中標出來

程式如下:


import cv2
import os
import numpy as np
from PIL import Image


detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()

def get_images_and_labels(path):
    image_paths = [os.path.join(path, f) for f in os.listdir(path)]
    face_samples = []
    ids = []
    for image_path in image_paths:
        image = Image.open(image_path).convert('L')
        image_np = np.array(image, 'uint8')
        # if os.path.split(image_path)[-1].split(".")[-1] != 'pgm':
        #     continue
        image_id = int(os.path.split(image_path)[-1].split(".")[0])
        faces = detector.detectMultiScale(image_np)
        for (x, y, w, h) in faces:
            face_samples.append(image_np[y:y + h, x:x + w])
            ids.append(image_id)
    return face_samples, ids

filepath = r'C:\Users\Administrator\Desktop\machine_learning\new_project\orl_faces1/'
faces, Ids = get_images_and_labels(filepath)
recognizer.train(faces, np.array(Ids))
recognizer.save('trainner/trainner.yml')

cam = cv2.VideoCapture(0)   # 獲取攝像頭
font = cv2.FONT_HERSHEY_SIMPLEX  # 載入一個字型  用於識別後  在圖片上標註名字

while True:
    ret, im = cam.read()
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.2, 5)
    for (x, y, w, h) in faces:
        cv2.rectangle(im, (x, y), (x + w, y + h), (225, 0, 0), 2)
        img_id, conf = recognizer.predict(gray[y:y + h, x:x + w])
        cv2.putText(im, str(img_id), (x, y + h), font, 0.55, (0, 255, 0), 1)
    cv2.imshow('im', im)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cam.release()
cv2.destroyAllWindows()

如有疏漏,再完善!

相關推薦

OpenCv人臉識別

準備: 1、匯入庫 編寫訓練程式首先需要做的是匯入相關的庫 1、匯入OpenCv庫 2、匯入os庫,用於檔案處理 3、匯入numpy庫,用於計算 4、匯入pillow庫,用於影象處理(好像沒有用到) 其實就是這

基於 OpenCV人臉識別

權重 apc 更多 你在 控制 leg 神經網絡 註意事項 初始化 基於 OpenCV 的人臉識別 一點背景知識 OpenCV 是一個開源的計算機視覺和機器學習庫。它包含成千上萬優化過的算法,為各種計算機視覺應用提供了一個通用工具包。根據這個項目的關於頁面,OpenCV

Python調用OpenCV實現人臉識別

source display document down char name 實現 cvt config [硬件環境] Win10 64位 [軟件環境] Python版本:2.7.3 IDE:JetBrains PyCharm 2016.3.2 Python庫: 1.1)

人工智慧人臉識別系統-郭冠召-專題視訊課程

人工智慧之人臉識別系統—1750人已學習 課程介紹         本課程以具體例子展示以Python語言實現的人臉識別系統,介紹與人臉識別演算法相關的各個子演算法的基本概念和實現人臉識別的基本步驟.同

基於Python3.7和opencv人臉識別(含資料收集,模型訓練)

前言 第一次寫部落格,有點緊張和興奮。廢話不多說,直接進入正題。如果你渴望使你的電腦能夠進行人臉識別;如果你不想了解什麼c++、底層演算法;如果你也不想買什麼樹莓派,安裝什麼幾個G的opencv;如果你和我一樣是個還沒入門的小白,但是想體驗一下人臉識別的魅力。那麼恭喜你,這篇文章就是為你準備的。讓我們開始吧

opencv-python人臉識別初探

推薦博文: 1、《淺析人臉檢測之Haar分類器方法》 2、《目標檢測的影象特徵提取之(三)Haar特徵》 3、《Face Recognition with Python》 程式碼: import cv2 import sys # Get user supplied values

OpenCV-Python 人臉識別

---恢復內容開始--- 一、簡單的識別   1、使用opencv進行貓的識別 1 import cv2 2 import numpy as np 3 # 讀取圖片 4 cat= cv2.imread('./cat.jpg') 5 # 將彩色圖片變成黑白圖片,識別速度更快,提高效率 6

使用opencv實現人臉識別及人眼識別

# 1 load 2 load jpg 3 hear gray 4 detect 5 draw import cv2 import numpy as np face_xml = cv2.CascadeClassifier('haarcascade_fronta

高科技應用人臉識別、人證比對

什麼叫人臉識別? 人臉識別,是基於人的臉部特徵資訊進行身份識別的一種生物識別技術。用攝像機或攝像頭採集含有人臉的影象或視訊流,並自動在影象中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。 一、 識別內容 (1)人臉檢測 ①參考模板法 ②人臉規則法 ③樣品

基於OpenCV人臉識別/人臉檢測

1:簡介 人臉檢測指從現實環境中識別出人臉的位置; 人臉識別基於人臉檢測,下一步才能辨析人臉的屬性,從而判別這個人是誰。 2:影象基本概念 幀:一張圖 幀數:一秒鐘重新整理多少張圖片 解析度:單位大小所能承載的畫素,能力為正相關 影象插值:提高影象解析度 OpenCV提供了5種插值方

opencv rtsp 人臉識別

import cv2 import dlibimport jsonface_detector = dlib.get_frontal_face_detector() cap = cv2.VideoCapture("rtsp://admin:[email protected]:554/h264/ch6

使用C++語言,基於opencv人臉識別

  基於OpenCV的人臉識別,主要是用到了訓練好的haarcascade_frontalface_default.xml檔案,這是OpenCV自帶的開源庫檔案,只需要載入程序序之中即可。  #include <opencv2\opencv.hpp> #inc

樹莓派用Python+OpenCV人臉識別

硬體:樹莓派 B+ 先安裝python-opencv:  sudo apt-get install python-opencv Python 2.7   OpenCV3.0 然後在樹莓派usb埠插入一個通用的usb攝像頭,看系統是否自動識別並

opencv實現人臉識別

import cv2 import matplotlib.pylab as plt import numpy as np def show(image): plt.imshow(image)

python使用opencv進行人臉識別

#include "cv.h" #include "highgui.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #includ

基於開源專案OpenCV人臉識別Demo版整理(不僅可以識別人臉,還可以識別眼睛鼻子嘴等)

 最近對人臉識別的程式非常感興趣,但是苦於沒有選修多媒體方向,看了幾篇關於人臉識別的論文,大概也沒看懂多少,什麼灰度處理啊,切割識別啊,雲裡霧裡,傻傻看不明白啊。各種苦惱。     於是就在網上找找,看有木有神馬開原始碼啊,要是有個現成的原始碼就更好了,百度it ,那些

OpenCV學習筆記(五十五)——用OpenCV人臉識別和性別識別contrib

人臉識別的故事說也說不完,調研的事還是交給大家吧。這裡說的是用OpenCV做人臉識別。 因為是真正的人臉識別,不是搞笑娛樂的東西,所以資料庫一定要強大的,推薦個網站http://www.face-rec.org/databases/。這裡有最全的人臉庫的概述,希望大家能找到

微信小程式人臉識別(2)

上一篇部落格已經將人臉的照片上傳到了人臉庫,接下來需要做的就是登入時拍照儲存並與人臉庫的圖片進行對比,當score大於95即識別成功!下面是wxml程式碼,主要用的就是camera元件,點選按鈕拍照並儲存,利用開關來控制使用前置還是後置攝像頭。<!--pages/cam

樹莓派學習(三)基於OpenCv人臉識別

博主的課程設計選題,開始在網上參考了諸多教程踩了很多坑最終得以實現,所以寫下心得總結,以便後人乘涼~https://blog.csdn.net/kyokozan/article/details/79192646https://blog.csdn.net/LC_1994/art

人工智慧小例子(二)-基於keras+openCV人臉識別

目前keras是對人工智慧來說,入門比較好的一款中介軟體,遮蔽了很多引數配置和實現細節,直接一層層進行網路搭建就可以。最近一直在學習相關知識,但是一直也沒有啥實用的功能出現,在網上有個例子,一下子就吸引住了我,使用keras迅速搭建一套人工智慧系統,輸入自己的照片和他人照片,