實時人臉識別系統:基于 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'
鍵即可退出程序。
五、總結
通過上述代碼,我們實現了一個完整的實時人臉識別系統。這個系統不僅能夠檢測攝像頭中的面部,還能識別出人臉的身份,并在圖像上顯示中文標簽。你可以根據自己的需求擴展這個系統,例如增加更多的人臉數據、優化識別算法或改進用戶界面。
如果你對這個項目感興趣,或者有任何問題,歡迎在評論區留言交流!