基於dlib和opencv庫的人臉識別

2021-10-24 09:20:20 字數 4567 閱讀 7884

檔名為 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)

:print

("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

:print

("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...