国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【opencv】python實(shí)現(xiàn)人臉檢測和識(shí)別訓(xùn)練

這篇具有很好參考價(jià)值的文章主要介紹了【opencv】python實(shí)現(xiàn)人臉檢測和識(shí)別訓(xùn)練。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

人臉識(shí)別

OpenCV 中的人臉識(shí)別通常基于哈爾特征分類器(Haar Cascade Classifier)進(jìn)行。以下是 OpenCV 人臉識(shí)別的基本原理:

  1. Haar Cascade Classifier

    • 特征分類器:Haar 特征是一種基于矩形區(qū)域的特征,可以用于圖像中的對(duì)象檢測。這些特征可以表示邊緣、線和區(qū)域的變化等。
    • 級(jí)聯(lián)分類器:Haar 級(jí)聯(lián)分類器是由大量的弱分類器組成的級(jí)聯(lián)結(jié)構(gòu),每個(gè)弱分類器用于檢測圖像的一個(gè)特定特征。級(jí)聯(lián)分類器能夠快速排除非目標(biāo)區(qū)域,提高效率。
  2. 訓(xùn)練分類器

    • Haar 分類器需要經(jīng)過訓(xùn)練,使用正樣本(包含人臉的圖像)和負(fù)樣本(不包含人臉的圖像)進(jìn)行訓(xùn)練。OpenCV 提供了工具來訓(xùn)練這些分類器。
  3. 人臉檢測過程

    • 圖像灰度化:首先,圖像被轉(zhuǎn)換為灰度圖像,簡化處理。
    • 級(jí)聯(lián)分類器應(yīng)用:Haar 分類器通過圖像的不同區(qū)域以固定的步長和縮放應(yīng)用。在每個(gè)區(qū)域,級(jí)聯(lián)分類器檢測是否有人臉特征。
    • 人臉候選區(qū)域:檢測到的候選區(qū)域被保留,其中可能包含人臉。
    • 非極大值抑制:對(duì)于重疊的候選區(qū)域,采用非極大值抑制,選擇最具代表性的人臉區(qū)域。
  4. 人臉識(shí)別

    • 識(shí)別是通過使用預(yù)訓(xùn)練的人臉識(shí)別模型進(jìn)行的。在檢測到人臉的區(qū)域中,可以使用各種方法(如基于模板的匹配或深度學(xué)習(xí)模型)進(jìn)行人臉識(shí)別。

首先安裝依賴

pip install opencv-python  
pip install opencv-contrib-python  
pip install numpy  
pip install pillow

拍照采集人臉

cv2.ideoCapture(0)的0是默認(rèn)攝像頭,如果外置攝像頭可以換其他數(shù)字試試,這段代碼其實(shí)就是通過opencv來拍照并保存用于后面的數(shù)據(jù)訓(xùn)練。

# 導(dǎo)入模塊  
import cv2  
  
# 攝像頭  
cap = cv2.VideoCapture(0)  
flag = 1  
num = 1  
while cap.isOpened():  
    ret, frame = cap.read()  
    cv2.imshow('frame', frame)  
    k = cv2.waitKey(1) & 0xFF  
    if k == ord('s'): # 按下s鍵,保存圖片  
        cv2.imwrite('./images/faces/name/{}.jpg'.format(num), frame)  
        print('{}.jpg saved'.format(num))  
        num += 1  
    elif k == ord(' '): # 按下空格鍵退出
        break  
cap.release() # 釋放攝像頭  
cv2.destroyAllWindows() # 關(guān)閉窗口

數(shù)據(jù)訓(xùn)練

haarcascade_frontalface_default.xml需要下載opencv的源碼文件來獲取。

下載地址:Releases - OpenCV

主要通過getImageAndLabel來解析對(duì)應(yīng)圖片的特征值保存到face_trainer.yml中用于后期的人臉檢測。在/images/faces的文件夾下的路徑應(yīng)該是id.人名拼音/圖片文件,用id來關(guān)聯(lián)人臉名稱,必須是整型數(shù)字,圖片名稱沒有要求,最好給識(shí)別人物的照片多準(zhǔn)備一些,識(shí)別效果會(huì)好一些。
【opencv】python實(shí)現(xiàn)人臉檢測和識(shí)別訓(xùn)練,python,opencv,python,人工智能

import os  
import cv2  
from PIL import Image  
import numpy as np  
  
  
def getImageAndLabel(path):  
    # 人臉數(shù)據(jù)路徑  
    faceSamples = []  
    # id  
    ids = []  
    # 獲取當(dāng)前路徑的文件夾  
    dirs = os.listdir(path)  
    # 加載分類器  
    faceCascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_default.xml')  
    # 遍歷文件夾  
    for dir in dirs:  
        # 獲取文件夾路徑  
        dir_path = os.path.join(path, dir)  
        # 獲取文件夾下的圖片  
        imagePaths = [os.path.join(dir_path, f) for f in os.listdir(dir_path)]  
        # 獲取id
        id = int(dir.split('.')[0])  
        # 遍歷圖片  
        for imagePath in imagePaths:  
            # 轉(zhuǎn)換為灰度圖  
            PIL_img = Image.open(imagePath).convert('L')  
            # 轉(zhuǎn)換為數(shù)組  
            img_numpy = np.array(PIL_img, 'uint8')  
            # 人臉檢測  
            faces = faceCascade.detectMultiScale(img_numpy)  
  
  
            # 遍歷人臉  
            for (x, y, w, h) in faces:  
                # 添加人臉數(shù)據(jù)  
                faceSamples.append(img_numpy[y:y + h, x:x + w])  
                # 添加id 
                ids.append(id)  
    # 返回人臉數(shù)據(jù)和id  
    return faceSamples, ids  
  
  
if __name__ == '__main__':  
    # 獲取人臉數(shù)據(jù)和姓名  
    faces, ids = getImageAndLabel('./images/faces')  
  
    # 導(dǎo)入人臉識(shí)別模型  
    recognizer = cv2.face.LBPHFaceRecognizer_create()  
  
    # 訓(xùn)練模型  
    recognizer.train(faces, np.array(ids))  
    # 保存模型  
    recognizer.save('./data/face_trainer.yml')

人臉識(shí)別

可以通過圖片,視頻,攝像頭來進(jìn)行人臉檢測,識(shí)別成功后會(huì)返回id,根據(jù)id索引來對(duì)應(yīng)人物名稱。多次識(shí)別失敗后會(huì)觸發(fā)警報(bào),這里沒有對(duì)應(yīng)的通報(bào)代碼,可以自行添加。

由于中文無法直接通過opencv添加,所以這里使用cv2ImgAddText將文字轉(zhuǎn)為圖片后加到原圖上。

# -*- coding: utf-8 -*-  
  
import cv2  
import numpy as np  
from PIL import ImageFont, ImageDraw, Image  
import ffmpeg  
import threading  
import time  
import subprocess  
  
# 加載分類器  
recognizer = cv2.face.LBPHFaceRecognizer_create()  
# 讀取訓(xùn)練數(shù)據(jù)  
recognizer.read('./data/face_trainer.yml')  
# 名稱  
names = ['未知', '劉德華', '成龍', '胡歌', '劉亦菲']  
# 警報(bào)全局變量  
warningtime = 0  
# 設(shè)置字體相關(guān)參數(shù)  
font_path = './data/font/simfang.ttf'  
  
  
def cv2ImgAddText(img, text, left, top, textColor=(0, 0, 255), textSize=20):  
    """  
    文字轉(zhuǎn)換為圖片并添加到圖片上  
    """    
    if (isinstance(img, np.ndarray)):  # 判斷是否OpenCV圖片類型  
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  
    # 創(chuàng)建一個(gè)可以在給定圖像上繪圖的對(duì)象  
    draw = ImageDraw.Draw(img)  
    # 字體的格式  
    fontStyle = ImageFont.truetype(  
        font_path, textSize, encoding="utf-8")  
    # 繪制文本  
    draw.text((left, top), text, textColor, font=fontStyle)  
  
    # 轉(zhuǎn)換回OpenCV格式  
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  
  
  
# 人臉檢測  
def detect_face(src_img):  
    # 導(dǎo)入人臉檢測模型  
    face_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_alt2.xml')  
    # 灰度轉(zhuǎn)換  
    gray = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)  
    faces = face_cascade.detectMultiScale(gray)  # 灰度圖像,縮放因子,最小鄰域,最大鄰域,最小尺寸,最大尺寸  
    # 繪制人臉矩形  
    for (x, y, w, h) in faces:  
        cv2.rectangle(src_img, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 圖片,左上角坐標(biāo),右下角坐標(biāo),顏色,線寬  
        # 人臉識(shí)別  
        id, confidence = recognizer.predict(gray[y:y + h, x:x + w])  
        print(id)  
        # 判斷是否為本人  
        if confidence < 70:  
            name = names[id]  
            confidence = "{0}%".format(round(100 - confidence))  
        else:  
            name = "unknown"  
            confidence = "{0}%".format(round(100 - confidence))  
        # 繪制姓名  
        src_img = cv2ImgAddText(src_img, name, x + 5, y + 5, (255, 0, 0), 50)  
        print(name)  
        # 繪制置信度  
        src_img = cv2ImgAddText(src_img, confidence, x + 5, y + h - 30, (255, 0, 0), 50)  
  
        # 判斷是否為本人  
        if name == "unknown":  
            # 警報(bào)  
            global warningtime  
            warningtime += 1  
            # 警報(bào)超過3次  
            if warningtime > 3:  
                # 發(fā)送郵件  
                # sendEmail()  
                print("警報(bào)")  
                # 重置警報(bào)次數(shù)  
                warningtime = 0  
    return src_img  
  
  
  
# 關(guān)閉  
if __name__ == '__main__':  
    # 讀取攝像頭  
    cap = cv2.VideoCapture(0)  # 0代表默認(rèn)攝像頭編號(hào),如果有多個(gè)攝像頭,可以嘗試1,2,3等等  
    # cap = cv.VideoCapture("./images/video.mp4")#讀取視頻文件  
    # cap = cv2.VideoCapture('rtmp://')  # 讀取視頻流  
    cap.set(cv2.CAP_PROP_FPS, 30)  # 設(shè)置幀率  
    cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)  # 設(shè)置緩沖區(qū)大小為1,你可以根據(jù)需要調(diào)整  
  
  
    # 人臉檢測  
    while True:  
        ret, frame = cap.read()  
        if ret:  
            img = detect_face(frame)  
            # 顯示圖片  
            cv2.imshow("img", img)  
            time.sleep(0.1)  
            # 等待鍵盤輸入  
            if cv2.waitKey(1) == ord('q'):  
                break  
    # 釋放資源  
    cap.release()  
    cv2.destroyAllWindows()  
      
    # # 讀取圖片  
    # img = cv2.imread("./images/img_5.png")  
    # img = detect_face(img)    # # 修改圖片大小  
    # img = cv2.resize(img, (800, 600))  
    # cv2.imshow("face_detect", img)    
    # cv2.waitKey(0)    
    # cv2.destroyAllWindows()

【opencv】python實(shí)現(xiàn)人臉檢測和識(shí)別訓(xùn)練,python,opencv,python,人工智能
上面內(nèi)容已經(jīng)包含全部需要代碼和需要資源獲取方法,但如果需要也可以通過這個(gè)地址獲取完整代碼和資源:
csdn資源地址文章來源地址http://www.zghlxwxcb.cn/news/detail-799268.html

到了這里,關(guān)于【opencv】python實(shí)現(xiàn)人臉檢測和識(shí)別訓(xùn)練的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包