程式碼
---
```python=
import mediapipe as mp
import numpy as np
import cv2
#將用到的函式庫引入進來
cap = cv2.VideoCapture(0) #讀取影片或鏡頭
mpface = mp.solutions.face_mesh #使用何種模型
face = mpface.FaceMesh(min_tracking_confidence=0.6, min_detection_confidence=0.6)
#以mpface呼叫FaceMesh這個函式,可以調整一些參數,按住ctrl滑鼠放solutions上面按右鍵找FaceMesh可看內部參數,()內可以調整數值
#min_tracking_confidence最低的偵測自信度,偵測臉的嚴謹度
#min_detection_confidence最低的追蹤自信度,追蹤臉的嚴謹度,越嚴謹就越要去重新偵測臉的位置
draw = mp.solutions.drawing_utils
#將畫座標的函式存進變數
faceLmsStyle = draw.DrawingSpec(color=(0, 0, 255), circle_radius = 1, thickness = 1)
#決定點的樣式,circle_radius決定圓的半徑,thickness決定粗度
faceConStyle = draw.DrawingSpec(color=(0, 255, 0), thickness=1)
#決定線的樣式
while True:
#用while去處理影片的每一幀
ret, img = cap.read() #cap.read()會回傳兩個值,第一個表示讀取影片下一幀是否成功(布林值),第二個為如果有則回傳取得的下一張圖片給我們
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #opencv讀取的圖片預設是BGR,更改為RGB
result = face.process(rgb) #以process來使用mediapipe所訓練好的模型去處理圖片,並將結果存進result裡面ss
imgHeight = img.shape[0]
imgWidth = img.shape[1]
#讀取圖片的寬高大小
if result.multi_face_landmarks: #如果有偵測到臉的話
for i in result.multi_face_landmarks: #用for迴圈去跑偵測到的每一張臉,把點跟線畫出來
draw.draw_landmarks(img, i, mpface.FACEMESH_CONTOURS, faceLmsStyle, faceConStyle)
#用draw呼叫landmarks,把點畫出來,第一個參數是要畫在哪張圖上,第二個把點傳進來
#如果要把點之間做連接則可增加第三個參數,第四個參數設定點的樣式,第五個設定線的樣式
for x, lm in enumerate(i.landmark): #把每個點的座標找出來、印出來
xPos = int(lm.x*imgWidth)
yPos = int(lm.y*imgHeight)
#lm.x、lm.y為各座標在圖片上的比例位置,乘上圖片寬高大小,就是實際的座標位置
print(x, xPos , yPos , lm.z) #在終端機印出每個點的號碼跟座標
cv2.putText(img, str(x) , (xPos-25 , yPos+5) , cv2.FONT_HERSHEY_SIMPLEX , 0.4 , (0 , 0 , 255), 1)
#在哪個影像上、顯示什麼、位置在哪、用甚麼字體、大小、顏色、粗度
cv2.imshow("window", img) #顯示影像
if cv2.waitKey(1) == ord('s'): #以按鍵s中斷影片,()內為影片速度
cap.release() #釋放webcam的資源,避免佔用資源
break
cv2.destroyAllWindows() #如果要在眾多openCV視窗下關閉特定視窗,('')帶入視窗名稱即可
```
結果
---


圖片中的數字依序為:特徵點座標編號(0)、x座標、y座標、z的比例位置
{"title":"DAY4","description":"程式碼","contributors":"[{\"id\":\"7b082fab-512a-4be2-acdf-c10d0936ce45\",\"add\":2025,\"del\":0}]"}