python3利用Dlib19.7實現(xiàn)人臉68個特征點標定
0.引言
利用Dlib官方訓練好的模型“shape_predictor_68_face_landmarks.dat”進行68點標定,利用OpenCv進行圖像化處理,在人臉上畫出68個點,并標明序號;
實現(xiàn)的68個特征點標定功能如下圖所示:

圖1 人臉68個特征點的標定
1.開發(fā)環(huán)境
python:3.6.3
dlib:19.7
OpenCv, numpy
需要調(diào)用的庫:
import dlib #人臉識別的庫dlib import numpy as np #數(shù)據(jù)處理的庫numpy import cv2 #圖像處理的庫OpenCv
2.設(shè)計流程
工作內(nèi)容主要以下兩大塊:68點標定和OpenCv繪點
68點標定:
借助官方的Demo(face_landmark_detection.py,在之前另一篇博客里面介紹過學習Python3 Dlib19.7進行人臉面部識別)實現(xiàn);
OpenCv繪點:
介紹了用到的 畫圓函數(shù)cv2.circle() 和 輸出字符串函數(shù) cv2.putText() ;
流程:
1.調(diào)用dlib庫來進行人臉識別,調(diào)用預(yù)測器“shape_predictor_68_face_landmarks.dat”進行68點標定
2.存入68個點坐標
3.利用cv2.circle來畫68個點
4.利用cv2.putText()函數(shù)來畫數(shù)字1-68
3.源碼
# 68-points
# 2017-12-28
# By TimeStamp
# #cnblogs: http://www.cnblogs.com/AdaminXie/
import dlib #人臉識別的庫dlib
import numpy as np #數(shù)據(jù)處理的庫numpy
import cv2 #圖像處理的庫OpenCv
# dlib預(yù)測器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
path="********************"
# cv2讀取圖像
img=cv2.imread(path+"test.jpg")
# 取灰度
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 人臉數(shù)rects
rects = detector(img_gray, 0)
for i in range(len(rects)):
landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])
for idx, point in enumerate(landmarks):
# 68點的坐標
pos = (point[0, 0], point[0, 1])
# 利用cv2.circle給每個特征點畫一個圈,共68個
cv2.circle(img, pos, 5, color=(0, 255, 0))
# 利用cv2.putText輸出1-68
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, str(idx+1), pos, font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
cv2.namedWindow("img", 2)
cv2.imshow("img", img)
cv2.waitKey(0)
note:OpenCv的畫圖函數(shù)
1. 畫圓 cv2.circle( img, (p1,p2), r, (255,255,255) )
參數(shù)1: img- 圖片對象;
參數(shù)2: (p1,p2)- 圓心坐標;
參數(shù)3: r- 半徑;
參數(shù)4: (255,255,255)- 顏色數(shù)組;
2. 輸出字符 cv2.putText( img,"test", (p1,p2), font, 4, (255,255,255), 2, cv2, LINE_AA )
參數(shù)1: img- 圖像對象;
參數(shù)2: "test"- 需要打印的字符text(數(shù)字的話可以利用str()轉(zhuǎn)成字符);
參數(shù)3: (p1,p2)- 坐標textOrg;
參數(shù)4: font- 字體fontFace(注意這里 font = cv2.FONT_HERSHEY_SIMPLEX);
參數(shù)5: 4- 字號fontScale;
參數(shù)6: (255,255,255)- 顏色數(shù)組;
參數(shù)7: 2- 線寬thickness;
參數(shù)8: LINE_AA- 線條種類line_type;
*關(guān)于 顏色數(shù)組:
(255,255,255), (藍色,綠色,紅色),每個值都是0-255;
比如:藍色(255,0,0),紫色(255,0,255)
可以調(diào)整cv2.circle()函數(shù)和cv2.putText()函數(shù)中的 半徑、線寬 等參數(shù)使得輸出滿足需求方便查看;
結(jié)果:

圖2 測試結(jié)果1
圖3 測試結(jié)果2
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
精選39道Python數(shù)據(jù)分析面試題提早備戰(zhàn)金三銀四
這篇文章主要為大家介紹了39道Python數(shù)據(jù)分析的面試題問答攻略幫助大家提早備戰(zhàn)金三銀四,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多精進,早日度過寒冬2023-12-12
python實現(xiàn)字符串加密 生成唯一固定長度字符串
這篇文章主要為大家詳細介紹了python實現(xiàn)字符串加密,生成唯一固定長度字符串,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03
matplotlib實現(xiàn)自定義散點形狀marker的3種方法
本文主要介紹了matplotlib實現(xiàn)自定義散點形狀marker的3種方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Python關(guān)于sys.argv[]的用法及說明
sys.argv[]是Python中用于從程序外部獲取參數(shù)的列表,參數(shù)索引從0開始,0索引代表腳本名稱本身,后續(xù)索引代表傳遞給腳本的參數(shù),通過指定索引可以獲取特定的參數(shù),如sys.argv[1]獲取第一個傳入?yún)?shù),當傳入多個參數(shù)時,可以通過切片或循環(huán)獲取全部參數(shù)2024-09-09
python tkinter實現(xiàn)界面切換的示例代碼
今天小編就為大家分享一篇python tkinter實現(xiàn)界面切換的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python實現(xiàn)將Excel轉(zhuǎn)換為json的方法示例
這篇文章主要介紹了Python實現(xiàn)將Excel轉(zhuǎn)換為json的方法,涉及Python文件讀寫及格式轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
使用Python實現(xiàn)Excel表格轉(zhuǎn)圖片
在數(shù)據(jù)處理與信息分享過程中,Excel表格作為一種強大的數(shù)據(jù)管理工具被廣泛應(yīng)用,這篇文章主要為大家詳細介紹了如何使用Python將Excel表格轉(zhuǎn)換為圖片,需要的可以參考下2024-04-04

