文、意如
標示臉部位置


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 - 關於我 - 意如