最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一:項目功能及流程分析

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

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

主要用到的模塊:

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

1、人臉錄入模塊。

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

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

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

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

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

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

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

3、人臉識別模塊。

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

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

  • 打開攝像頭。
  • 檢測人臉部分,框出人臉。
  • 進行人臉識別,在畫面中顯示人臉姓名。

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

1、建立項目文件

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

 宏文件源代碼供參考:

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'
# 級聯(lián)人臉特征檢測器
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  # 線條粗細
GRAPH_THICKNESS = 1

2、人臉錄入模塊代碼實現(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)  # 加載級聯(lián)檢測器,人臉特征分類器
    return face_classifier.detectMultiScale(gray, minSize=FACE_MIN_SIZE), gray
def get_image_name(name):  # 獲取圖片的命名名字,格式:1.lihua.jpg
    # 1.lihua.jpg 格式。如果文件中沒有則加入,如果已有則替換
    # 把讀出來的圖片名稱,用字典存,然后用name去字典里面找有沒有。
    f = os.listdir(IMG_SAVE_PATH)  # os.listdir(IMG_SAVE_PATH)返回目標路徑里的文件列表
    if len(f) == 0:  # 文件列表f的長度為0則表示沒有圖片,編號為1
        name_number = 1
    else:  # 說明原文件有人臉照片,如果出現(xiàn)相同人臉姓名替換成新的,沒有編號為最大值max.name.jpg加入進去。
        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):  # 保證只有一個人臉出現(xiàn)在畫面中
    if len(faces) == 0:
        print('沒有檢測到人臉,請調(diào)整?。。?)
    if len(faces) > 1:
        print('檢測到多個人臉,請調(diào)整?。。?)
    x, y, w, h = faces[0]
    # 保存人臉部分,保存到文件夾,格式為 1.李華.jpg 格式。如果文件中沒有則加入,如果已有則替換
    cv.imwrite('./data/' + get_image_name(name), img[y: y + h, x: x + w])
    print('錄入成功,按 q 鍵退出')
def main():
    # 人臉錄入部分是為了得到人臉的數(shù)據(jù),然后后面對人臉進行訓練。
    # 人臉數(shù)據(jù)信息主要有三個部分。1、人臉圖片。 2、人臉名字。 3、編號(編號需要和名字需要統(tǒng)一。以為訓練數(shù)據(jù)是拿序號和人臉進行比對)
    # 1、人臉圖片(打開攝像頭、只取人臉部分、給用戶實時展示人臉的畫面(把人臉框出來)、保存和退出)
    # 2、人臉名字。(用戶輸入)
    # 3、編號。(文件名稱記錄)
    # 打開攝像頭
    cap = cv.VideoCapture(0)
    if not cap.isOpened():
        print('連接攝像頭失敗')
    # 輸入人臉的名字
    name = input("請輸入姓名:")
    if name == ' ':
        print('姓名不能為空,請重新輸入!??!')
    print('姓名輸入完成:按 s 保存,按 q 退出。')
    # 循環(huán)讀取攝像頭的每一幀畫面,然后識別畫面中的人臉,識別后只保存人臉部分,作為訓練數(shù)據(jù)。
    while True:
        ret, frame = cap.read()
        if not ret:
            print('讀取失敗')
            break
        # 檢測人臉,且提取人臉部分。這部分直接使用一個函數(shù)封裝起來。
        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()

 運行imput_face.py錄入人臉:

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

3、訓練數(shù)據(jù)模塊代碼實現(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]
    # 獲取訓練對象
    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()

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

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

"""
    通過攝像頭識別人臉(LBPH識別器(訓練的數(shù)據(jù),和當前的人臉圖片))得到編號。編號和人臉的對應關(guān)系,標記人臉和名字并展示畫面
    創(chuàng)建識別器,加載訓練數(shù)據(jù)
    讀取文件構(gòu)造編號和人臉的關(guān)系
    打開攝像頭
    循環(huán)取每幀畫面
    人臉檢測且提取人臉部分
    遍歷人臉進行識別
    框出人臉部分且實時展示畫面(畫面上帶有  )
    關(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)建識別器
    recognizer = cv.face.LBPHFaceRecognizer_create()
    recognizer.read(TRAIN_DATA_SAVE_PATH)
    # 讀取文件構(gòu)造編號和人臉的關(guān)系。以字典的形式保存編號和人臉名字的關(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
        # 人臉檢測,且提取人臉部分。
        faces, gray = img_extract_faces(frame)
        # 遍歷人臉進行識別
        for x, y, w, h in faces:
            img_id, confidence = recognizer.predict(gray[y: y+h, x: x+w])
            # 返回圖片編號和置信度。置信度為兩張圖片的相似程度
            # 框出人臉且實時展示畫面
            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()

 運行face_recognition.py文件進行人臉識別:

項目介紹到這里,感謝閱讀?。?!

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

相關(guān)文章

  • django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法

    django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法

    今天小編就為大家分享一篇django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 在python中修改.properties文件的操作

    在python中修改.properties文件的操作

    這篇文章主要介紹了在python中修改.properties文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • pytorch梯度剪裁方式

    pytorch梯度剪裁方式

    今天小編就為大家分享一篇pytorch梯度剪裁方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python安裝及建立虛擬環(huán)境的完整步驟

    Python安裝及建立虛擬環(huán)境的完整步驟

    在使用 Python 開發(fā)時,建議在開發(fā)環(huán)境和生產(chǎn)環(huán)境下都使用虛擬環(huán)境來管理項目的依賴,下面這篇文章主要給大家介紹了關(guān)于Python安裝及建立虛擬環(huán)境的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Python中Flask-RESTful編寫API接口(小白入門)

    Python中Flask-RESTful編寫API接口(小白入門)

    這篇文章主要介紹了Python中Flask-RESTful編寫API接口(小白入門),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Python+OpenCv制作證件圖片生成器的操作方法

    Python+OpenCv制作證件圖片生成器的操作方法

    這篇文章主要介紹了Python+OpenCv制作證件圖片生成器的操作方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 從零開始學習Python Selenium瀏覽器元素定位與實戰(zhàn)技巧

    從零開始學習Python Selenium瀏覽器元素定位與實戰(zhàn)技巧

    這篇文章主要為大家詳細介紹了一份Selenium全教程,涵蓋從基礎(chǔ)到進階的核心知識點,基于Selenium 4版本(當前主流版本),適合新手入門及進階學習,快跟隨小編一起學習起來吧
    2026-03-03
  • 對pandas中to_dict的用法詳解

    對pandas中to_dict的用法詳解

    今天小編就為大家分享一篇對pandas中to_dict的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • pycharm配置git(圖文教程)

    pycharm配置git(圖文教程)

    這篇文章主要介紹了pycharm配置git(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 基于Python生成個性二維碼過程詳解

    基于Python生成個性二維碼過程詳解

    這篇文章主要介紹了基于Python生成個性二維碼過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論

华坪县| 周至县| 兴城市| 连南| 工布江达县| 普格县| 玛曲县| 昌宁县| 和硕县| 开封县| 西乌珠穆沁旗| 沾化县| 阜新市| 万全县| 湘乡市| 响水县| 凤翔县| 奈曼旗| 美姑县| 谷城县| 武清区| 荆州市| 肥乡县| 宜州市| 闻喜县| 紫金县| 额敏县| 阿城市| 铜梁县| 甘肃省| 辽阳市| 平阳县| 凭祥市| 桂平市| 镇原县| 土默特左旗| 兴安县| 嘉黎县| 科技| 湖州市| 长春市|