[AI][Python]OpenCV進行臉部偵測

  • 20
  • 0
  • AI
  • 2025-05-10

文、意如

標示臉部位置
import cv2  # 匯入 OpenCV 函式庫

# 取得預設的臉部特徵分類器(haarcascade XML 檔案)的完整路徑
case_path = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"

# 使用分類器檔案建立臉部偵測器
face_cascade = cv2.CascadeClassifier(case_path)

# 讀取圖片,原始為彩色 BGR 格式
img = cv2.imread('media/img3.jpg')

# 將圖片轉換為灰階,有助於提高偵測效率
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 偵測臉部,返回一組(x, y, w, h)座標與大小的矩形框列表
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,      # 每次影像縮小的比例(越小越精細但慢)
    minNeighbors=5,       # 每個候選框至少要通過多少鄰近檢查,數值越大越嚴格
    minSize=(30, 30)      # 最小的臉部大小(小於這個不會被偵測)
)

print(faces) #[[272  52 143 143]] (img3.jpg)

# 遍歷所有偵測到的人臉座標,畫出綠色矩形框線
for (x, y, w, h) in faces:
    cv2.rectangle(
        img,                # 要畫圖的目標圖像
        (x, y),             # 左上角座標
        (x + w, y + h),     # 右下角座標
        (0, 255, 0),        # 框線顏色:綠色 (B, G, R)
        2                   # 框線粗細
    )

# 設定顯示的人臉數文字內容
face_count_text = f"Find {len(faces)}"  # 使用 len(faces) 計算找到幾個臉

# 使用 getTextSize 計算文字寬度與高度,方便放在右下角
text_size, _ = cv2.getTextSize(
    face_count_text,        # 要顯示的文字
    cv2.FONT_HERSHEY_SIMPLEX,  # 使用的字型
    0.7,                    # 文字縮放大小
    2                       # 線條粗細
)

# 計算右下角的座標(影像寬度 - 文字寬度 - 10)
text_x = img.shape[1] - text_size[0] - 10
text_y = img.shape[0] - 10  # 靠底部 10 像素的位置

# 將人臉數量的文字寫到右下角
cv2.putText(
    img,                   # 要畫字的圖像
    face_count_text,       # 要顯示的文字內容
    (text_x, text_y),      # 顯示位置(左下角起點)
    cv2.FONT_HERSHEY_SIMPLEX,  # 使用字型
    0.7,                   # 字體大小縮放
    (255, 255, 255),       # 白色文字 (B, G, R)
    2                      # 線條粗細
)

# 顯示圖片視窗
cv2.imshow('Face Detection', img)

# 等待使用者按下任意鍵後關閉所有 OpenCV 視窗
cv2.waitKey(0)
cv2.destroyAllWindows()
擷取臉部與存檔
count=1 

# 遍歷所有偵測到的人臉座標,畫出綠色矩形框線
for (x, y, w, h) in faces:
    cv2.rectangle(
        img,                # 要畫圖的目標圖像
        (x, y),             # 左上角座標
        (x + w, y + h),     # 右下角座標
        (0, 255, 0),        # 框線顏色:綠色 (B, G, R)
        2                   # 框線粗細
    )
    #擷取與存檔
    filename= "media/face"+str(count)+".jpg" #存檔名稱
    image1=img[y:y+h,x:x+w] #取得臉部圖形
    image2=cv2.resize(image1,(400,400)) #重置圖形大小
    cv2.imwrite(filename,image2)
    count +=1
完整程式碼:
import cv2  # 匯入 OpenCV 函式庫

# 取得預設的臉部特徵分類器(haarcascade XML 檔案)的完整路徑
case_path = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"

# 使用分類器檔案建立臉部偵測器
face_cascade = cv2.CascadeClassifier(case_path)

# 讀取圖片,原始為彩色 BGR 格式
img = cv2.imread('media/img4.jpg')

# 將圖片轉換為灰階,有助於提高偵測效率
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 偵測臉部,返回一組(x, y, w, h)座標與大小的矩形框列表
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,      # 每次影像縮小的比例(越小越精細但慢)
    minNeighbors=5,       # 每個候選框至少要通過多少鄰近檢查,數值越大越嚴格
    minSize=(30, 30)      # 最小的臉部大小(小於這個不會被偵測)
)

#print(faces) #[[272  52 143 143]] (img3.jpg)
print(faces) 
"""
img4.jpg 臉部座標
[[184  51  73  73]
 [ 60  60  79  79]
 [270 192  71  71]
 [141 177  93  93]]
 
"""
count=1 

# 遍歷所有偵測到的人臉座標,畫出綠色矩形框線
for (x, y, w, h) in faces:
    cv2.rectangle(
        img,                # 要畫圖的目標圖像
        (x, y),             # 左上角座標
        (x + w, y + h),     # 右下角座標
        (0, 255, 0),        # 框線顏色:綠色 (B, G, R)
        2                   # 框線粗細
    )
    #擷取與存檔
    filename= "media/face"+str(count)+".jpg" #存檔名稱
    image1=img[y:y+h,x:x+w] #取得臉部圖形
    image2=cv2.resize(image1,(400,400)) #重置圖形大小
    cv2.imwrite(filename,image2)
    count +=1
    

# 設定顯示的人臉數文字內容
face_count_text = f"Find {len(faces)}"  # 使用 len(faces) 計算找到幾個臉




# 使用 getTextSize 計算文字寬度與高度,方便放在右下角
text_size, _ = cv2.getTextSize(
    face_count_text,        # 要顯示的文字
    cv2.FONT_HERSHEY_SIMPLEX,  # 使用的字型
    0.7,                    # 文字縮放大小
    2                       # 線條粗細
)

# 計算右下角的座標(影像寬度 - 文字寬度 - 10)
text_x = img.shape[1] - text_size[0] - 10
text_y = img.shape[0] - 10  # 靠底部 10 像素的位置

# 將人臉數量的文字寫到右下角
cv2.putText(
    img,                   # 要畫字的圖像
    face_count_text,       # 要顯示的文字內容
    (text_x, text_y),      # 顯示位置(左下角起點)
    cv2.FONT_HERSHEY_SIMPLEX,  # 使用字型
    0.7,                   # 字體大小縮放
    (255, 255, 255),       # 白色文字 (B, G, R)
    2                      # 線條粗細
)

# 顯示圖片視窗
cv2.imshow('Face Detection', img)

# 等待使用者按下任意鍵後關閉所有 OpenCV 視窗
cv2.waitKey(0)
cv2.destroyAllWindows()
圖片特效處理

 

Yiru@Studio - 關於我 - 意如