嘿呀,朋友!你看現在好多地方都用人臉識別啦,比如手機解鎖、門禁系統啥的。咱今天也來用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()

開場白:哇塞,來看我這個超酷的人臉識別程序!它能實時檢測攝像頭中的人臉,並在臉上畫出特徵點,就像給人臉做了個“標記”,是不是很神奇呀!快來試試吧!

代碼分析:

  1. 導入庫和創建主窗口
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庫進行圖像處理和計算機視覺的基本方法。

口語化總結:哇哦,我們成功做出了一個人臉識別程序!這在生活中可以有很多應用呢,比如考勤系統、安全監控等。在學習上,我們對圖像處理和計算機視覺有了更深入的瞭解,還學會了使用多個庫來實現一個複雜的功能。以後我們可以繼續探索更多有趣的應用,讓我們的程序更加厲害!