# 實時人臉識別系統:基于 OpenCV 和 Python 的實現

實時人臉識別系統:基于 OpenCV 和 Python 的實現

在當今數字化時代,人臉識別技術已經廣泛應用于各種場景,從手機解鎖到安防監控,再到智能門禁系統。今天,我將通過一個完整的代碼示例,詳細講解如何使用 Python 和 OpenCV 實現一個實時人臉識別系統。這個系統不僅可以檢測攝像頭中的面部,還能識別出人臉的身份,并在圖像上顯示中文標簽。

一、項目背景

人臉識別技術的核心在于能夠快速、準確地識別出人臉,并將其與已知的身份進行匹配。OpenCV 是一個強大的計算機視覺庫,它提供了豐富的圖像處理和機器學習功能,非常適合用于實現人臉識別系統。在這個項目中,我們將結合 OpenCV 的人臉檢測和識別功能,以及 Python 的靈活性,構建一個實時人臉識別系統。

二、技術棧

  • Python:一種廣泛使用的高級編程語言,具有豐富的庫和框架支持。
  • OpenCV:一個開源的計算機視覺庫,提供了大量圖像和視頻處理功能。
  • Pillow:一個 Python 圖像處理庫,用于處理圖像中的中文文本。

三、代碼實現

1. 添加中文文本到圖像

OpenCV 默認不支持中文字符,因此我們需要借助 Pillow 庫來實現中文文本的繪制。以下是一個自定義函數 cv2AddChineseText,用于在圖像上添加中文文本:

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFontdef cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):""" 向圖片中添加中文 """if (isinstance(img, np.ndarray)):  # 判斷是否OpenCV圖片類型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 實現array到image的轉換draw = ImageDraw.Draw(img)  # 在img圖片上創建一個繪圖的對象# 字體的格式fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")draw.text(position, text, textColor, font=fontStyle)  # 繪制文本return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # 轉換回OpenCV格式

2. 準備訓練數據

為了實現人臉識別,我們需要準備一些人臉圖像作為訓練數據。這些圖像可以是同一人物的多張照片,也可以是不同人物的照片。我們將這些圖像加載到一個列表中,并為每張圖像分配一個標簽:

def image_re(image):a = cv2.imread(image, 0)  # 以灰度模式讀取圖像a = cv2.resize(a, (120, 180))  # 調整圖像大小images.append(a)images = []
image_re('wp1.png')  # 加載人物1的圖像1
image_re('wp2.png')  # 加載人物1的圖像2
image_re('zjl1.png')  # 加載人物2的圖像1
image_re('zjl2.png')  # 加載人物2的圖像2labels = [0, 0, 1, 1]  # 為每張圖像分配標簽,0表示人物1,1表示人物2

3. 訓練人臉識別模型

我們將使用 OpenCV 提供的 FisherFace 人臉識別算法來訓練模型。FisherFace 是一種經典的人臉識別算法,基于線性判別分析(LDA)來優化特征提取:

recognizer = cv2.face.FisherFaceRecognizer_create(threshold=20000)
recognizer.train(images, np.array(labels))

4. 實時人臉檢測與識別

接下來,我們將使用 OpenCV 的 Haar 特征級聯分類器來檢測攝像頭中的面部,并使用訓練好的模型進行識別。以下是完整的代碼:

# 加載人臉檢測器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 打開攝像頭
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))for (x, y, w, h) in faces:face = gray[y:y+h, x:x+w]  # 提取人臉區域face = cv2.resize(face, (120, 180))  # 調整人臉大小以匹配訓練數據label, confidence = recognizer.predict(face)  # 使用模型進行識別dic = {0: '我', 1: '周杰倫', -1: '無法識別'}  # 創建字典,將標簽映射為人物名稱text = dic.get(label, '未知')  # 獲取識別結果cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)  # 繪制矩形框frame = cv2AddChineseText(frame, text, (x, y-10), textColor=(255, 0, 0))  # 添加中文標簽cv2.imshow('Face Recognition', frame)  # 顯示結果if cv2.waitKey(1) & 0xFF == ord('q'):  # 按下 'q' 鍵退出breakcap.release()  # 釋放攝像頭資源
cv2.destroyAllWindows()  # 關閉所有窗口

四、運行效果

運行上述代碼后,攝像頭將打開并實時顯示視頻流。當檢測到人臉時,程序會繪制一個矩形框,并在框上方顯示識別結果(如“我”或“周杰倫”)。按下 'q' 鍵即可退出程序。

五、總結

通過上述代碼,我們實現了一個完整的實時人臉識別系統。這個系統不僅能夠檢測攝像頭中的面部,還能識別出人臉的身份,并在圖像上顯示中文標簽。你可以根據自己的需求擴展這個系統,例如增加更多的人臉數據、優化識別算法或改進用戶界面。

如果你對這個項目感興趣,或者有任何問題,歡迎在評論區留言交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux:(五種IO模型)

目錄 一、對IO的重新認識 二、IO的五種模型 1.阻塞IO 2.非阻塞IO 3.信號驅動IO 4.IO多路轉接 5.異步IO 6.一些概念的解釋 三、非阻塞IO的代碼實現 1.fcntl 2.實現主程序 一、對IO的重新認識 如果有人問你IO是什么,你該怎么回答呢? 你可能會說…

將電腦控制手機編寫為MCP server

文章目錄 電腦控制手機后,截屏代碼復習MCP server構建修改MCP的config文件測試效果困惑電腦控制手機后,截屏代碼復習 def capture_window(hwnd: int, filename: str = None) -> dict:""&

[ctfshow web入門] web6

前置知識 入口點(目錄)爆破 還記得之前說過網站的入口的嗎,我們輸入url/xxx,其中如果url/xxx存在,那么訪問成功,證明存在這樣一個入口點;如果訪問失敗則證明不存在此入口點。所以我們可以通過遍歷url/xxx,…

【計算機網絡】Linux配置SNAT策略

什么是NAT? NAT 全稱是 Network Address Translation(網絡地址轉換),是一個用來在多個設備共享一個公網 IP上網的技術。 NAT 的核心作用:將一個網絡中的私有 IP 地址,轉換為公網 IP 地址,從而…

Mathematics | Branch

注:本文為“遇見數學”翻譯的 “數學分支概覽” 兩篇文章合輯。 數學世界的版圖:主要分支概覽(上) 原創 遇見數學 2025 年 04 月 03 日 12:02 河南 數學的分支(Areas of Mathematics) 在文藝復興之前&am…

Ubuntu(CentOS、Rockylinux等)快速進入深度學習pytorch環境

這里寫自定義目錄標題 安裝進入系統(如Ubuntu22.04)安裝anacondapip、conda換源pip換源conda換源 安裝nvidia安裝pytorch環境針對于wsl的優化 安裝進入系統(如Ubuntu22.04) docker 、 wsl 、 雙系統 、服務器系統 推薦 Ubuntu 20…

什么是混雜模式?為什么 macvlan 依賴它

在 macvlan 場景中,物理網絡是否支持混雜模式(Promiscuous Mode) 直接影響 macvlan 虛擬接口的通信能力。以下是詳細解釋和操作指南: 一、什么是混雜模式?為什么 macvlan 依賴它? 混雜模式的定義 當物理網絡…

物理數據流圖

物理數據流圖(Physical Data Flow Diagram, PDFD)詳解 物理數據流圖是結構化系統分析中的一種建模工具,用于描述系統在物理環境下的具體實現方式,包括硬件、軟件、人工操作和物理文件等實際組成部分。它與**邏輯數據流圖&#xf…

Linux開發工具——vim

📝前言: 上篇文章我們講了Linux開發工具——apt,這篇文章我們來講講Linux開發工具——vim 🎬個人簡介:努力學習ing 📋個人專欄:Linux 🎀CSDN主頁 愚潤求學 🌄其他專欄&a…

在 Langflow 中構建靈活的自定義組件:從基礎到高級實踐

本文深入探討了如何在 Langflow 平臺中創建功能豐富的自定義組件。通過詳細的目錄結構解析、分步實現指南和多個實戰案例,幫助開發者掌握利用 Python 生態擴展低代碼平臺的方法,打造高效的數據處理流程。 理解組件架構設計 自定義組件是在 Langflow 中創…

stm32+LTR-390UV使用教程含源碼

stm32LTR-390UV使用教程含源碼 (csdn首發源碼),本人大四學生,考研已上岸,畢設做的全向輪小車,這個是環境檢測部分LTR-390UV使用教程 文章目錄 目錄 文章目錄 前言 一、硬件準備與連接 二、數據手冊 1.…

【嵌入式系統設計師】知識點:第2章 嵌入式系統硬件基礎知識

提示:“軟考通關秘籍” 專欄圍繞軟考展開,全面涵蓋了如嵌入式系統設計師、數據庫系統工程師、信息系統管理工程師等多個軟考方向的知識點。從計算機體系結構、存儲系統等基礎知識,到程序語言概述、算法、數據庫技術(包括關系數據庫、非關系型數據庫、SQL 語言、數據倉庫等)…

Java 項目灰度發布的詳細實現與實踐

前言 灰度發布是一種通過逐步將新功能或更新推向一部分用戶來降低上線風險的技術。本文將詳細介紹如何在 Java 項目中實現灰度發布,并提供相關的配置參數、代碼示例以及 uml 圖,幫助您更好地理解和應用這一技術。 一、灰度發布的核心思想 灰度發布的核…

使用 Swift 實現 LRU 緩存淘汰策略

📌 實現思路 一、核心目標 我們要實現一個緩存類: 支持通過 get(key) 獲取緩存的值;支持通過 put(key, value) 寫入緩存;緩存容量有限,當超過容量時要淘汰最久未使用的元素。 二、為什么用「哈希表 雙向鏈表」 功…

C#中為自定義控件設置工具箱圖標

在C#中為自定義控件設置工具箱圖標,可通過以下步驟實現: ### 步驟說明: 1. **準備圖標文件** - 創建或選擇一個16x16像素的位圖(.bmp)文件,建議使用透明背景以確保清晰顯示。 2. **添加位圖到項目** -…

Linux數據庫:【數據庫基礎】【庫的操作】【表的操作】

目錄 一.數據庫基礎 1.1什么是數據庫 1.2基本使用 1.2.1連接服務器 1.2.2服務器,數據庫,表關系 1.2.3使用案例 1.2.4數據存儲結構 ?編輯 1.3MySQL架構 1.4SQL分類 1.5存儲引擎 1.5.1什么是存儲引擎 1.5.2查看存儲引擎 ?編輯 1.5.3存儲引擎…

CKPT文件是什么?

檢查點(Checkpoint,簡稱ckpt)是一種用于記錄系統狀態或數據變化的技術,廣泛應用于數據庫管理、機器學習模型訓練、并行計算以及網絡安全等領域。以下將詳細介紹不同領域中ckpt檢查點的定義、功能和應用場景。 數據庫中的ckpt檢查點…

Redis的公共操作命令

目錄 1.Key操作命令1.1 keys *1.2 exists <key]>1.3 type <key>1.4 del <key>1.5 unlink <key>1.6 ttl <key>1.7 expire <key> <秒數>1.8 move <key> <index> 2.庫操作命令2.1 select <index>2.2 dbsize2.3 flush…

【LLM】使用MySQL MCP Server讓大模型輕松操作本地數據庫

隨著MCP協議&#xff08;Model Context Protocol&#xff09;的出現&#xff0c;使得 LLM 應用與外部數據源和工具之間的無縫集成成為可能&#xff0c;本章就介紹如何通過MCP Server讓LLM能夠直接與本地的MySQL數據庫進行交互&#xff0c;例如新增、修改、刪除數據&#xff0c;…

【C++】從零實現Json-Rpc框架(2)

目錄 JsonCpp庫 1.1- Json數據格式 1.2 - JsonCpp介紹 ? 序列化接口 ? 反序列化接口 1.3 - Json序列化實踐 JsonCpp使用 Muduo庫 2.1 - Muduo庫是什么 2.2 - Muduo庫常見接口介紹 TcpServer類基礎介紹 EventLoop類基礎介紹 TcpConnection類基礎介紹 TcpClient…