欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用python的opencv實(shí)現(xiàn)人臉識(shí)別

 更新時(shí)間:2023年12月06日 09:30:11   作者:小牛不愛吃糖  
這篇文章主要介紹了使用python的opencv實(shí)現(xiàn)人臉識(shí)別功能,本項(xiàng)目主要使用python語(yǔ)言,主要的模塊庫(kù)有os,opencv-python,opencv-contrib-python,需要的朋友可以參考下

簡(jiǎn)介:本項(xiàng)目主要使用python語(yǔ)言,主要的模塊庫(kù)有os,opencv-python,opencv-contrib-python。項(xiàng)目主要分為三個(gè)部分,人臉錄入,訓(xùn)練數(shù)據(jù),實(shí)現(xiàn)人臉的識(shí)別。本博客包含源代碼,以及各個(gè)功能模塊,需求分析的詳細(xì)解釋,當(dāng)然本項(xiàng)目只是簡(jiǎn)單的實(shí)現(xiàn)人臉識(shí)別,可以在此基礎(chǔ)上擴(kuò)展。

一:項(xiàng)目功能及流程分析

我們項(xiàng)目的主要功能,也就是最終的實(shí)現(xiàn)效果是當(dāng)我們打開攝像頭后,在攝像頭里會(huì)出現(xiàn)我的人臉頭像,且對(duì)我的人臉進(jìn)行識(shí)別,在畫面中能夠框出我的人臉部分并顯示出畫面中人臉的姓名。

項(xiàng)目主要包含以下三個(gè)大的模塊:人臉錄入、訓(xùn)練數(shù)據(jù)、人臉識(shí)別。

主要用到的模塊:

  • os:為操作系統(tǒng)的訪問(wèn)提供相關(guān)功能的支持(處理文件和目錄)
  • opencv-python:計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫(kù)
  • opencv-contrib-python:opencv 的擴(kuò)展模塊

1、人臉錄入模塊。

主要目的:通過(guò)人臉錄入模塊去得到人臉的數(shù)據(jù),然后通過(guò)已知數(shù)據(jù)去訓(xùn)練模型,得到人臉的姓名標(biāo)簽和人臉的一一對(duì)應(yīng)關(guān)系,那么進(jìn)行人臉的識(shí)別時(shí),就能根據(jù)訓(xùn)練的數(shù)據(jù)去識(shí)別畫面中的人臉是誰(shuí)了,能夠在畫面中顯示出它的名字。

主要功能:首先能打開攝像頭,找到框出人臉的部分,且我們要對(duì)人臉部分截取保存,因?yàn)槲覀兪怯?xùn)練姓名和人臉一一對(duì)應(yīng),所有別忘了保存圖片的時(shí)候讓用戶輸入姓名,為了減小圖片大小,我們可以將截取的圖片轉(zhuǎn)化成灰度圖片,不需要彩色的。步驟如下:

  • 打開攝像頭。
  • 輸入人臉對(duì)應(yīng)的姓名。
  • 檢測(cè)畫面中的人臉部分。
  • 保存人臉圖片。(灰度圖片,不需要彩色)

 2、數(shù)據(jù)訓(xùn)練模塊。

主要目的:通過(guò)保存的數(shù)據(jù),使用模塊自帶的訓(xùn)練器,訓(xùn)練得到姓名和人臉的一一對(duì)應(yīng)關(guān)系。

主要功能:讀取文件的 圖片和姓名,開始訓(xùn)練數(shù)據(jù),訓(xùn)練結(jié)束將數(shù)據(jù)保存。步驟如下:

  • 讀取保存的全部灰度圖片和姓名。
  • 訓(xùn)練數(shù)據(jù)。
  • 保存數(shù)據(jù)。

3、人臉識(shí)別模塊。

 主要目的:根據(jù)所訓(xùn)練的數(shù)據(jù),能夠在我們打開攝像頭的時(shí)候,標(biāo)記出畫面中的人臉部分,且在畫面中顯示人臉的姓名。

主要功能:能夠打開攝像頭,能夠框出畫面中的人臉部分,能夠識(shí)別畫面中的人臉并在畫面中顯示人臉的姓名。步驟如下:

  • 打開攝像頭。
  • 檢測(cè)人臉部分,框出人臉。
  • 進(jìn)行人臉識(shí)別,在畫面中顯示人臉姓名。

二:項(xiàng)目具體實(shí)現(xiàn)代碼及結(jié)果演示

1、建立項(xiàng)目文件

我們將本項(xiàng)目中用到一些路徑定義為宏,保存到python文件中,命名為hong,py。將人臉灰度照片保存到文件夾中,建立文件夾data。訓(xùn)練數(shù)據(jù)也需要保存到文本里面,新建文本文件命名為Training_data。新建三個(gè)python文件,分別用于三個(gè)模塊的具體實(shí)現(xiàn)。項(xiàng)目目錄如下:

 宏文件源代碼供參考:

INPUT_FACE_WINDOWS_NAME = 'input_face'
BGR_GREEN = (0, 255, 0)
BGR_RED = (0, 0, 255)
FACE_MIN_SIZE = (60, 60)
# 保存圖片的路徑
IMG_SAVE_PATH = './data'
# 級(jí)聯(lián)人臉特征檢測(cè)器
FACE_CLASSIFIER_PATH = 'D:/python_project/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml'
TRAIN_DATA_SAVE_PATH = './Training_data'
FACE_RECOGNITION_WINDOW_NAME = "Face recognition"
FONT_SCALE = 0.75  # 字體比例
TEXT_THICKNESS = 1  # 線條粗細(xì)
GRAPH_THICKNESS = 1

2、人臉錄入模塊代碼實(shí)現(xiàn)。

import cv2 as cv
from hong import *
import os
def img_extract_faces(img):  # 將人臉圖片轉(zhuǎn)為灰度
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 轉(zhuǎn)成灰度圖像
    face_classifier = cv.CascadeClassifier(FACE_CLASSIFIER_PATH)  # 加載級(jí)聯(lián)檢測(cè)器,人臉特征分類器
    return face_classifier.detectMultiScale(gray, minSize=FACE_MIN_SIZE), gray
def get_image_name(name):  # 獲取圖片的命名名字,格式:1.lihua.jpg
    # 1.lihua.jpg 格式。如果文件中沒(méi)有則加入,如果已有則替換
    # 把讀出來(lái)的圖片名稱,用字典存,然后用name去字典里面找有沒(méi)有。
    f = os.listdir(IMG_SAVE_PATH)  # os.listdir(IMG_SAVE_PATH)返回目標(biāo)路徑里的文件列表
    if len(f) == 0:  # 文件列表f的長(zhǎng)度為0則表示沒(méi)有圖片,編號(hào)為1
        name_number = 1
    else:  # 說(shuō)明原文件有人臉照片,如果出現(xiàn)相同人臉姓名替換成新的,沒(méi)有編號(hào)為最大值max.name.jpg加入進(jìn)去。
        name_map = {f.split('.')[1] : int(f.split('.')[0]) for f in os.listdir(IMG_SAVE_PATH)}
        name_number = name_map[name] if name in name_map else max(name_map.values())+1
    # return IMG_SAVE_PATH + str(name_number) + "." + name + ".jpg"
    return str(name_number) + "." + name + ".jpg"
def save_face(faces, img, name):  # 保證只有一個(gè)人臉出現(xiàn)在畫面中
    if len(faces) == 0:
        print('沒(méi)有檢測(cè)到人臉,請(qǐng)調(diào)整?。。?)
    if len(faces) > 1:
        print('檢測(cè)到多個(gè)人臉,請(qǐng)調(diào)整?。?!')
    x, y, w, h = faces[0]
    # 保存人臉部分,保存到文件夾,格式為 1.李華.jpg 格式。如果文件中沒(méi)有則加入,如果已有則替換
    cv.imwrite('./data/' + get_image_name(name), img[y: y + h, x: x + w])
    print('錄入成功,按 q 鍵退出')
def main():
    # 人臉錄入部分是為了得到人臉的數(shù)據(jù),然后后面對(duì)人臉進(jìn)行訓(xùn)練。
    # 人臉數(shù)據(jù)信息主要有三個(gè)部分。1、人臉圖片。 2、人臉名字。 3、編號(hào)(編號(hào)需要和名字需要統(tǒng)一。以為訓(xùn)練數(shù)據(jù)是拿序號(hào)和人臉進(jìn)行比對(duì))
    # 1、人臉圖片(打開攝像頭、只取人臉部分、給用戶實(shí)時(shí)展示人臉的畫面(把人臉框出來(lái))、保存和退出)
    # 2、人臉名字。(用戶輸入)
    # 3、編號(hào)。(文件名稱記錄)
    # 打開攝像頭
    cap = cv.VideoCapture(0)
    if not cap.isOpened():
        print('連接攝像頭失敗')
    # 輸入人臉的名字
    name = input("請(qǐng)輸入姓名:")
    if name == ' ':
        print('姓名不能為空,請(qǐng)重新輸入?。。?)
    print('姓名輸入完成:按 s 保存,按 q 退出。')
    # 循環(huán)讀取攝像頭的每一幀畫面,然后識(shí)別畫面中的人臉,識(shí)別后只保存人臉部分,作為訓(xùn)練數(shù)據(jù)。
    while True:
        ret, frame = cap.read()
        if not ret:
            print('讀取失敗')
            break
        # 檢測(cè)人臉,且提取人臉部分。這部分直接使用一個(gè)函數(shù)封裝起來(lái)。
        faces, gray = img_extract_faces(frame)
        # 框出人臉
        for x, y, w, h in faces:
            cv.rectangle(
                img=frame, pt1=(x, y), pt2=(x+w, y+h),
                color=BGR_GREEN, thickness=1
            )
        cv.imshow(INPUT_FACE_WINDOWS_NAME, frame)
        # 保存和退出
        k = cv.waitKey(1)
        if k == ord('s'):
            # 保存圖像,(只需保存灰度圖像)
            save_face(faces, gray, name)
        elif k == ord('q'):
            break
    # 釋放內(nèi)存
    cap.release()
    cv.destroyAllWindows()
if __name__ == '__main__':
    main()

 運(yùn)行imput_face.py錄入人臉:

 點(diǎn)擊英文的s鍵,即可保存人臉到data文件中,如下圖所示:

3、訓(xùn)練數(shù)據(jù)模塊代碼實(shí)現(xiàn)。

import cv2 as cv
import os
from hong import *
import numpy as np
def main():
    # 獲取圖片完整路徑
    image_paths = [os.path.join(IMG_SAVE_PATH, f) for f in os.listdir(IMG_SAVE_PATH)]
    # 遍歷列表中的圖片
    faces = [cv.imread(image_path, 0) for image_path in image_paths]
    # 獲取訓(xùn)練對(duì)象
    img_ids = [int(f.split('.')[0])for f in os.listdir(IMG_SAVE_PATH)]
    recognizer = cv.face.LBPHFaceRecognizer_create()
    recognizer.train(faces, np.array(img_ids))
    print(faces, np.array(img_ids))
    # 保存文件
    recognizer.write(TRAIN_DATA_SAVE_PATH)
if __name__ == '__main__':
    main()

運(yùn)行train.py文件訓(xùn)練data文件夾里面的數(shù)據(jù): 

4、人臉識(shí)別模塊代碼實(shí)現(xiàn)。

"""
    通過(guò)攝像頭識(shí)別人臉(LBPH識(shí)別器(訓(xùn)練的數(shù)據(jù),和當(dāng)前的人臉圖片))得到編號(hào)。編號(hào)和人臉的對(duì)應(yīng)關(guān)系,標(biāo)記人臉和名字并展示畫面
    創(chuàng)建識(shí)別器,加載訓(xùn)練數(shù)據(jù)
    讀取文件構(gòu)造編號(hào)和人臉的關(guān)系
    打開攝像頭
    循環(huán)取每幀畫面
    人臉檢測(cè)且提取人臉部分
    遍歷人臉進(jìn)行識(shí)別
    框出人臉部分且實(shí)時(shí)展示畫面(畫面上帶有  )
    關(guān)閉攝像頭和窗口
"""
import os
import cv2 as cv
from cv2 import face
from hong import *
from train import *
from imput_face import img_extract_faces
def get_color_text(confidence, name):
    if confidence > 85:
        return BGR_RED, "unknown"
    return BGR_GREEN, name
def main():
    # 創(chuàng)建識(shí)別器
    recognizer = cv.face.LBPHFaceRecognizer_create()
    recognizer.read(TRAIN_DATA_SAVE_PATH)
    # 讀取文件構(gòu)造編號(hào)和人臉的關(guān)系。以字典的形式保存編號(hào)和人臉名字的關(guān)系
    name_map = {int(f.split('.')[0]): f.split('.')[1] for f in os.listdir(IMG_SAVE_PATH)}
    # 打開攝像頭
    cap = cv.VideoCapture(0)
    if not cap.isOpened():
        print('連接攝像頭失敗')
    print("按q退出")
    # 循環(huán)取每幀畫面
    while True:
        ret, frame = cap.read()
        if not ret:
            print('讀取失敗')
            break
        # 人臉檢測(cè),且提取人臉部分。
        faces, gray = img_extract_faces(frame)
        # 遍歷人臉進(jìn)行識(shí)別
        for x, y, w, h in faces:
            img_id, confidence = recognizer.predict(gray[y: y+h, x: x+w])
            # 返回圖片編號(hào)和置信度。置信度為兩張圖片的相似程度
            # 框出人臉且實(shí)時(shí)展示畫面
            color, text = get_color_text(confidence, name_map[img_id])
            cv.putText(
                img=frame, text=text, org=(x, y),
                fontFace=cv.FONT_HERSHEY_SIMPLEX, fontScale=FONT_SCALE,
                color=color, thickness=TEXT_THICKNESS
            )
            cv.circle(
                img=frame, center=(x+w//2, y+h//2),
                radius=w // 2,
                color=color, thickness=GRAPH_THICKNESS
            )
        cv.imshow(FACE_RECOGNITION_WINDOW_NAME, frame)
        if cv.waitKey(1) == ord('q'):
            break
    # 關(guān)閉攝像頭,釋放空間
    cap.release()
    cv.destroyAllWindows()
if __name__ == '__main__':
    main()

 運(yùn)行face_recognition.py文件進(jìn)行人臉識(shí)別:

項(xiàng)目介紹到這里,感謝閱讀?。。?/strong>

到此這篇關(guān)于使用python的opencv實(shí)現(xiàn)人臉識(shí)別的文章就介紹到這了,更多相關(guān)python opencv人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pytorch MSELoss計(jì)算平均的實(shí)現(xiàn)方法

    pytorch MSELoss計(jì)算平均的實(shí)現(xiàn)方法

    這篇文章主要介紹了pytorch MSELoss計(jì)算平均的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 利用?Python?讓圖表動(dòng)起來(lái)

    利用?Python?讓圖表動(dòng)起來(lái)

    這篇文章主要給大家分享如何利用?Python?讓圖表動(dòng)起來(lái),本文圍繞Python?讓圖表動(dòng)起來(lái)的話題舉例matplotlib動(dòng)畫功能的一個(gè)例子展開文章內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • Python+Pygame實(shí)現(xiàn)經(jīng)典魂斗羅游戲

    Python+Pygame實(shí)現(xiàn)經(jīng)典魂斗羅游戲

    《魂斗羅》(Contra)是由Konami于1987年推出的一系列卷軸射擊類單機(jī)游戲。本文將利用Python中的Pygame庫(kù)實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下
    2022-05-05
  • 解決python文件字符串轉(zhuǎn)列表時(shí)遇到空行的問(wèn)題

    解決python文件字符串轉(zhuǎn)列表時(shí)遇到空行的問(wèn)題

    下面小編就為大家?guī)?lái)一篇解決python文件字符串轉(zhuǎn)列表時(shí)遇到空行的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • django和flask哪個(gè)值得研究學(xué)習(xí)

    django和flask哪個(gè)值得研究學(xué)習(xí)

    在本篇文章里小編給大家整理的是一篇關(guān)于django和flask哪個(gè)值得研究學(xué)習(xí)內(nèi)容,需要的朋友們可以參考下。
    2020-07-07
  • Python無(wú)法安裝包的一種解決(Requirement already satisfied問(wèn)題)

    Python無(wú)法安裝包的一種解決(Requirement already satisfied問(wèn)題)

    這篇文章主要介紹了Python無(wú)法安裝包的一種解決(Requirement already satisfied問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python數(shù)據(jù)可視化Seaborn畫熱力圖

    python數(shù)據(jù)可視化Seaborn畫熱力圖

    這篇文章主要介紹了數(shù)據(jù)可視化Seaborn畫熱力圖,熱力圖的想法其實(shí)很簡(jiǎn)單,用顏色替換數(shù)字,下面我們來(lái)看看文章對(duì)操作過(guò)程的具體介紹吧,需要的小伙伴可以參考一下具體內(nèi)容,希望對(duì)你有所幫助
    2022-01-01
  • python如何實(shí)現(xiàn)圖片重命名并保存

    python如何實(shí)現(xiàn)圖片重命名并保存

    這篇文章主要介紹了python如何實(shí)現(xiàn)圖片重命名并保存問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Python文件修改的兩種方式

    詳解Python文件修改的兩種方式

    這篇文章主要介紹了詳解Python文件修改的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python使用paramiko操作linux的方法講解

    Python使用paramiko操作linux的方法講解

    今天小編就為大家分享一篇關(guān)于Python使用paramiko操作linux的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論