close

使用 Picamera2 與 OpenCV 實現實時人臉檢測

本文展示如何利用 OpenCV 的 DNN 模型進行實時人臉檢測,並將影像來源改為 Raspberry Pi 官方推薦的 Picamera2

程式碼範例與註解

from picamera2 import Picamera2
import cv2
import time

# 初始化 Picamera2
picam2 = Picamera2()

# 配置相機的預覽模式,設定主要圖像大小為 640x480
camera_config = picam2.create_preview_configuration(main={"size": (640, 480)})
picam2.configure(camera_config)
picam2.start()  # 啟動相機

# 加載 DNN 模型
net = cv2.dnn.readNet(
    'opencv_face_detector.pbtxt',  # 模型結構檔案
    'opencv_face_detector_uint8.pb'  # 模型權重檔案
)

# 將模型封裝為檢測模型,設置輸入參數
model = cv2.dnn_DetectionModel(net)
model.setInputParams(size=(300, 300), scale=1.0)  # 模型輸入尺寸和縮放係數

# 設定影像顯示窗口的寬度及其他相關參數
WIDTH = 600  # 顯示窗口寬度
FONT = cv2.FONT_HERSHEY_SIMPLEX  # 文字字體

while True:  # 進行連續影像處理
    begin_time = time.time()  # 記錄當前時間以計算 FPS

    # 從 Picamera2 獲取一幀圖像,作為 NumPy 陣列
    frame = picam2.capture_array()
    ratio = frame.shape[1] / frame.shape[0]  # 計算原始影像的寬高比
    HEIGHT = int(WIDTH / ratio)  # 調整顯示影像的高度以保持比例
    frame = cv2.resize(frame, (WIDTH, HEIGHT))  # 調整影像尺寸
    frame = cv2.flip(frame, 1)  # 鏡像翻轉,讓視覺效果更自然

    # 如果影像是 RGBA 格式(具有 4 通道),則轉換為 BGR 格式
    if frame.shape[2] == 4:  # 檢查影像的通道數是否為 4
        frame = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR)  # 將 RGBA 轉換為 BGR

    # 使用模型進行人臉檢測
    classes, confs, boxes = model.detect(frame, 0.5)  # 偵測,0.5 為信心值閾值
    for (classid, conf, box) in zip(classes, confs, boxes):  # 遍歷所有檢測到的框
        x, y, w, h = box  # 取得檢測框的位置與尺寸
        fps = 1 / (time.time() - begin_time)  # 計算 FPS
        text = "fps: {:.1f} {:.2f}%".format(fps, float(conf) * 100)  # FPS 與信心值

        # 確保文字框不超出影像邊界
        if y - 20 < 0:
            y1 = y + 20
        else:
            y1 = y - 10

        # 繪製檢測框與文字
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)  # 繪製矩形框
        cv2.putText(frame, text, (x, y1), FONT, 0.5, (0, 204, 255), 2)  # 顯示 FPS 與信心值

    # 在窗口中顯示處理後的影像
    cv2.imshow("video", frame)

    # 按下 ESC 鍵(ASCII 碼為 27)以退出
    if cv2.waitKey(1) == 27:
        cv2.destroyAllWindows()  # 關閉所有 OpenCV 窗口
        picam2.stop()  # 停止相機
        break  # 結束程式

程式解析

  • 模型加載: 使用 cv2.dnn.readNet 加載 DNN 模型,讀取所需的 .pbtxt.pb 文件。
  • 使用 Picamera2: 初始化 Picamera2,設定影像大小為 640x480,並啟用相機。
  • 實時人臉檢測: 捕捉影像後,使用 model.detect 進行人臉檢測,返回類別、置信度和邊界框。
  • 繪製結果與 FPS: 使用 cv2.rectangle 繪製人臉邊界框,並用 cv2.putText 顯示置信度與每秒幀數(FPS)。
  • 顯示影像: 使用 cv2.imshow 顯示檢測結果,按下 ESC 鍵退出。

結論

本程式展示了如何使用 Picamera2 作為影像來源,結合 OpenCV 的 DNN 模型進行實時人臉檢測。Picamera2 是 Raspberry Pi 官方推薦的相機驅動,提供了高效能和靈活性,適合用於嵌入式系統中的實時影像處理應用。

arrow
arrow
    創作者介紹
    創作者 liusming 的頭像
    liusming

    劉老師的跨域創想工坊

    liusming 發表在 痞客邦 留言(0) 人氣()