檔名為 shape_predictor_68_face_landmarks.dat
img=cv2.imread(image)
img=cv2.cvtcolor(img,cv2.color_bgr2rgb)
cv2.circle(img,center,radius,color,thickness)
camera=cv2.videocapture(0)
功能:呼叫攝像頭
camera.set(cv2.cap_prop_frame_width, 1080)
camera.set(cv2.cap_prop_frame_height, 768)
功能:設定畫面長寬
ret,frame=camera.read()
功能:獲取攝像頭中的每一幀的畫面
返回值:ret為布林值,如果讀取幀是正確的則返回true,反之返回false;frame為每一幀的影象
frame=cv2.flip(frame,1)
功能:將獲取的畫面水平翻轉
返回值:返回翻轉後的畫面
檢測器:
detector=dlib.get_frontal_face_detector()
功能:人臉檢測畫框
返回值:返回乙個預設的人臉檢測器
faces=detector(img,0)
**器:
predictor=dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
功能:標記人臉68個關鍵點
引數:儲存的模型路徑
返回值:68個人臉關鍵點的**器
plt.figure(figzise=(10,8))
功能:宣告整個畫布的大小
引數:大小(此處為長為10,寬為8)
pt.subplot(121)
plt.imshow(img)
plt.axis("off")
功能:結束繪圖
plt.show()
功能:顯示畫布
#通過opev中的imread讀取測試檔案
img=cv2.imread(test_img)
#人臉檢測畫框,返回乙個預設的人臉檢測器
detector = dlib.get_frontal_face_detector(
)#通過模型建立,返回乙個標記68個人臉關鍵點的**器
predictor_path=
"shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)
#對影象畫人臉框,返回人臉檢測矩形框4點座標
faces=detector(img,0)
iflen
(faces)
("found faces"
.format
(len
(faces)))
for i in
range
(len
(faces)):
landmarks = np.matrix(
[[p.x, p.y]
for p in predictor(img, faces[i]
).parts()]
)for point in landmarks:
pos =
(point[0,
0], point[0,
1])#給68個特徵點都畫乙個圓
cv2.circle(img, pos,
3, color=(0
,255,0
),thickness=1)
else
("face not found"
)#opencv讀取的是brg通道的,需要轉換成rgb
img=cv2.cvtcolor(img,cv2.color_bgr2rgb)
#表示figure的大小為寬為10,長為8
plt.figure(figsize=(10
,8))
#12代表有有一行兩列,1代表此時繪製第乙個圖
plt.subplot(
121)
plt.imshow(plt.imread(test_img)
)plt.axis(
"off"
)#12代表有有一行兩列,2代表此時繪製第二個圖
plt.subplot(
122)
plt.imshow(img)
plt.axis(
"off"
)plt.show(
)
import cv2
import dlib
import numpy as np
class
facedetective()
:def
__init__
(self)
:# 人臉檢測畫框,返回乙個預設的人臉檢測器
self.detector = dlib.get_frontal_face_detector(
)# 通過模型建立,返回乙個標記68個人臉關鍵點的**器
self.predictor = dlib.shape_predictor(
"shape_predictor_68_face_landmarks.dat"
)def
identify
(self,frame)
:# 對影象畫人臉框,返回人臉檢測矩形框4點座標
faces=self.detector(frame,0)
iflen
(faces)
:print
("found face"
.format
(len
(faces)))
for i in
range
(len
(faces)):
landmarks = np.matrix(
[[p.x, p.y]
for p in self.predictor(frame, faces[i]
).parts()]
)for point in landmarks:
pos =
(point[0,
0], point[0,
1]) cv2.circle(frame, pos,
3, color=(0
,0,255
), thickness=2)
else
:print
("face not found"
)return frame
defrun_camera
(self)
:# 呼叫攝像頭
camera=cv2.videocapture(0)
# 設定長寬
camera.
set(cv2.cap_prop_frame_width,
1080
) camera.
set(cv2.cap_prop_frame_height,
768)
while
true
:# 讀取攝像頭每幀的畫面
ret,frame=camera.read(
)if ret:
# 水平翻轉
frame=cv2.flip(frame,1)
# 對每幀的畫面進行識別
frame=self.identify(frame)
cv2.imshow(
"cam"
,frame)
# 按q退出
if cv2.waitkey(1)
&0xff
==ord
('q'):
break
camera.release(
) cv2.destroyallwindows(
)if __name__==
'__main__'
: facedetective(
).run_camera(
)
之前嘗試不使用類來寫攝像頭識別的**,發現呼叫攝像頭後的執行效率極低,原因可能是類的使用能夠減少python記憶體的消耗。 dlib庫的學習
dlib庫支援cnn演算法,有python版本和c 版本,先實現python版本,再實現c 版本,最後實現android版本。注意,還需要安裝libx11 dev庫,使用命令 sudo apt get install libx11 dev在dlib 19.15目錄下執行命令 mkdir build ...
dlib庫的安裝
t1方法 pip install dlib 此方法是需要在你安裝cmake boost環境的計算機使用 1 使用pip install cmake安裝cmake庫 2 使用pip install boost安裝boost庫 t2方法 conda install c menpo dlib 19.10 ...
基於Dlib庫的人臉68個特徵點檢測
利用dlib.get frontal face detector 獲取人臉框 利用dlib.shape predictor shape predictor 68 face landmarks.dat 獲取人臉68個特徵點 import numpy as np import cv2 import dl...