嘿呀,朋友!你看現在好多地方都用人臉識別啦,比如手機解鎖、門禁系統啥的。咱今天也來用Python的Tkinter和一些相關庫做個人臉識別的小玩意兒。要用到的庫有cv2(OpenCV,用於圖像處理和計算機視覺)、dlib(用於人臉檢測和特徵點提取)、numpy(用於數值計算)。安裝這些庫可以在命令行輸入:
pip install opencv-python
pip install dlib
pip install numpy
下面是代碼示例:
import tkinter as tk
import cv2
import dlib
import numpy as np
# 創建主窗口
root = tk.Tk()
root.title("人臉識別")
# 創建標籤用於顯示圖像
image_label = tk.Label(root)
image_label.pack()
# 加載人臉檢測器和特徵點預測器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 打開攝像頭
cap = cv2.VideoCapture(0)
# 人臉識別函數
def face_recognition():
ret, frame = cap.read()
if ret:
# 將圖像轉換為灰度圖
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 檢測人臉
faces = detector(gray)
for face in faces:
# 提取人臉特徵點
landmarks = predictor(gray, face)
# 在圖像上繪製特徵點
for n in range(0, 68):
x = landmarks.part(n).x
y = landmarks.part(n).y
cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)
# 將圖像轉換為RGB格式(Tkinter需要)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 將圖像轉換為Tkinter可用的格式
image = tk.PhotoImage(data=cv2.imencode('.png', frame)[1].tobytes())
# 更新標籤顯示的圖像
image_label.config(image=image)
image_label.image = image
# 每隔10毫秒調用一次人臉識別函數
root.after(10, face_recognition)
# 啓動人臉識別
face_recognition()
# 主事件循環
root.mainloop()
# 釋放攝像頭資源
cap.release()
開場白:哇塞,來看我這個超酷的人臉識別程序!它能實時檢測攝像頭中的人臉,並在臉上畫出特徵點,就像給人臉做了個“標記”,是不是很神奇呀!快來試試吧!
代碼分析:
- 導入庫和創建主窗口:
import tkinter as tk
import cv2
import dlib
import numpy as np
root = tk.Tk()
root.title("人臉識別")
導入了所需的庫,然後創建了主窗口,並設置標題為“人臉識別”。 2. 創建標籤用於顯示圖像:
image_label = tk.Label(root)
image_label.pack()
創建了一個標籤image_label,用於在窗口中顯示攝像頭捕捉到的圖像。 3. 加載人臉檢測器和特徵點預測器:
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
加載了dlib庫中的人臉檢測器detector和特徵點預測器predictor。這裏的“shape_predictor_68_face_landmarks.dat”是一個預訓練的模型文件,用於檢測人臉的68個特徵點。 4. 打開攝像頭:
cap = cv2.VideoCapture(0)
使用cv2.VideoCapture(0)打開默認的攝像頭,如果有多個攝像頭,可以指定攝像頭的索引。 5. 人臉識別函數:
def face_recognition():
ret, frame = cap.read()
if ret:
# 將圖像轉換為灰度圖
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 檢測人臉
faces = detector(gray)
for face in faces:
# 提取人臉特徵點
landmarks = predictor(gray, face)
# 在圖像上繪製特徵點
for n in range(0, 68):
x = landmarks.part(n).x
y = landmarks.part(n).y
cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)
# 將圖像轉換為RGB格式(Tkinter需要)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 將圖像轉換為Tkinter可用的格式
image = tk.PhotoImage(data=cv2.imencode('.png', frame)[1].tobytes())
# 更新標籤顯示的圖像
image_label.config(image=image)
image_label.image = image
# 每隔10毫秒調用一次人臉識別函數
root.after(10, face_recognition)
這個函數是人臉識別的核心部分。首先,它從攝像頭讀取一幀圖像frame,然後將圖像轉換為灰度圖gray,以便進行人臉檢測。接着,使用detector檢測灰度圖中的人臉,並將檢測到的人臉存儲在faces列表中。對於每個檢測到的人臉,使用predictor提取人臉的特徵點landmarks,然後在圖像上繪製特徵點。最後,將圖像轉換為RGB格式(Tkinter需要),並將圖像轉換為Tkinter可用的格式image,更新標籤image_label顯示的圖像。最後,使用root.after(10, face_recognition)每隔10毫秒調用一次face_recognition函數,實現實時人臉識別。 6. 啓動人臉識別:
face_recognition()
調用face_recognition函數,啓動人臉識別程序。 7. 主事件循環:
root.mainloop()
這是Tkinter程序的主循環,它會一直運行,監聽用户的操作,比如關閉窗口等。 8. 釋放攝像頭資源:
cap.release()
在程序結束時,釋放攝像頭資源,避免資源泄漏。
項目知識點和目標:
- 知識點:
- Tkinter庫的基本使用,包括創建窗口、標籤等組件。
- OpenCV庫的使用,包括讀取攝像頭圖像、圖像顏色空間轉換、繪製圖形等。
- dlib庫的使用,包括人臉檢測和特徵點提取。
numpy庫的使用,用於數值計算。- 圖像的處理和顯示。
- 目標:
- 成功創建一個基於Tkinter的人臉識別程序,能夠實時檢測攝像頭中的人臉,並在臉上繪製特徵點。
- 瞭解人臉識別的基本原理和流程。
- 掌握使用OpenCV、dlib和
numpy庫進行圖像處理和計算機視覺的基本方法。
口語化總結:哇哦,我們成功做出了一個人臉識別程序!這在生活中可以有很多應用呢,比如考勤系統、安全監控等。在學習上,我們對圖像處理和計算機視覺有了更深入的瞭解,還學會了使用多個庫來實現一個複雜的功能。以後我們可以繼續探索更多有趣的應用,讓我們的程序更加厲害!