程式碼 --- ```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視窗下關閉特定視窗,('')帶入視窗名稱即可 ``` 結果 --- ![](https://hackmd.io/_uploads/B101W4Ou2.png) ![](https://hackmd.io/_uploads/Skug-V__3.png) 圖片中的數字依序為:特徵點座標編號(0)、x座標、y座標、z的比例位置
{"title":"DAY4","description":"程式碼","contributors":"[{\"id\":\"7b082fab-512a-4be2-acdf-c10d0936ce45\",\"add\":2025,\"del\":0}]"}
Expand menu