使用Python+OpenCV+Dlib實現人臉檢測與人臉特征關鍵點識別
到目前為止,我們在檢測人臉方面做得很好,但是我們仍然需要一些工作來提取所有特征(地標)。接下來讓我們開始吧。步驟3:識別人臉特征你喜歡魔術嗎?到目前為止,DLib的工作方式相當神奇,只需幾行代碼我們就可以實現很多,而現在我們遇到了一個全新的問題,它還會繼續這么簡單嗎?回答是肯定的!原來DLib提供了一個名為shape_predictor()的函數,它將為我們提供所有的魔法,但是需要一個預先訓練的模型才能工作。有幾種模型可以與shape_predictor一起工作,我正在使用的模型可以在這里下載,也可以嘗試其他模型。讓我們看看新代碼現在是什么樣子import cv2import dlib# Load the detectordetector = dlib.get_frontal_face_detector()# Load the predictorpredictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# read the imageimg = cv2.imread("face.jpg")# Convert image into grayscalegray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarksfaces = detector(gray)for face in faces: x1 = face.left() # left point y1 = face.top() # top point x2 = face.right() # right point y2 = face.bottom() # bottom point # Look for the landmarks landmarks = predictor(image=gray, box=face) x = landmarks.part(27).x y = landmarks.part(27).y # Draw a circle cv2.circle(img=img, center=(x, y), radius=5, color=(0, 255, 0), thickness=-1)# show the imagecv2.imshow(winname="Face", mat=img)# Wait for a key press to exitcv2.waitKey(delay=0)# Close all windowscv2.destroyAllWindows()像以前一樣,我們總是在同一個代碼上構建代碼,現在使用我們的預測函數為每個人臉找到特征。但現在我還在做一些奇怪的事情,比如如下代碼的數值27是用來干嘛的?landmarks = predictor(image=gray, box=face)x = landmarks.part(27).xy = landmarks.part(27).y我們的預測函數會返回一個包含68個點的對象,根據我們之前看到的圖片,如果你注意到的話,會發現點27正好在眼睛之間,所以如果所有的計算正確,你應該看到一個綠點在眼睛之間,如下圖所示:

我們已經很接近了,現在讓我們渲染所有的點,而不是只渲染一個:import cv2import numpy as npimport dlib# Load the detectordetector = dlib.get_frontal_face_detector()# Load the predictorpredictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# read the imageimg = cv2.imread("face.jpg")# Convert image into grayscalegray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarksfaces = detector(gray)for face in faces: x1 = face.left() # left point y1 = face.top() # top point x2 = face.right() # right point y2 = face.bottom() # bottom point # Create landmark object landmarks = predictor(image=gray, box=face) # Loop through all the points for n in range(0, 68): x = landmarks.part(n).x y = landmarks.part(n).y # Draw a circle cv2.circle(img=img, center=(x, y), radius=3, color=(0, 255, 0), thickness=-1)# show the imagecv2.imshow(winname="Face", mat=img)# Delay between every framcv2.waitKey(delay=0)# Close all windowscv2.destroyAllWindows()

但是如果你對所有的點都不感興趣呢?實際上,你可以調整你的范圍間隔來獲得上面術語表中指定的任何特征,就像我在這里做的那樣:

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯網行業年度評選
-
11月20日立即報名>> 【免費下載】RISC-V芯片發展現狀與測試挑戰-白皮書
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產未來的關鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術在線大會
-
11月28日立即下載>> 【白皮書】精準洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯網產業大會


分享













