運行環(huán)境:python 3.7.4+OpenCV 4.1.2.30+dlib 19.16.0+cmake 3.15.3冈爹,此外還有visual studio2019和boost必須也要有,這些都可以在百度上搜到并下載奋构,注意版本手趣,dlib和cmake是我無數(shù)次失敗后才找到的對應的版本晌该,不然會在配置時出錯。
本程序的整體思路是先利用OpenCV加載視頻,利用dlib提供的predictor和model獲取人臉及特征气笙,最后再利用cv2.Laplacian(face1次企,face2).var()方法獲取清晰度評估。
利用dlib進行人臉識別時需要以下兩個文件:1潜圃、shape_predictor_68_face_landmarks.dat缸棵;
2、dlib_face_recognition_resnet_model_v1.dat
下載地址:http://dlib.net/files/
如果對你有所幫助請點關(guān)注谭期,謝謝堵第!
提醒一下,2020年4月之前不要作為研究生結(jié)課作業(yè)使用
import cv2,dlib,os,glob,numpy,time
# 聲明各個資源路徑
super_path = os.path.abspath("..")+"/resourses/"
predictor_path = super_path + "shape_predictor_68_face_landmarks.dat"
model_path = super_path + "dlib_face_recognition_resnet_model_v1.dat"
img_path = super_path + "pictures"
video_path = super_path + "111.mp4"
# 加載視頻
video = cv2.VideoCapture(video_path)
# 加載模型
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor(predictor_path)
facerec = dlib.face_recognition_model_v1(model_path)
# 創(chuàng)建窗口
cv2.namedWindow("人臉識別", cv2.WINDOW_KEEPRATIO)
cv2.resizeWindow("人臉識別", 300,540)
descriptors = []
faces = []
# 處理視頻隧出,按幀處理
suc,frame = video.read()
flag = True # 標記是否是第一次迭代
i = 0 # 記錄當前迭代到的幀位置
while suc:
if i % 3 == 0: # 每3幀截取一幀
# 轉(zhuǎn)為灰度圖像處理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
dets = detector(gray, 1) # 檢測幀圖像中的人臉
# 處理檢測到的每一張人臉
for k,d in enumerate(dets):
shape = sp(gray,d)
# print(d, d.left(), d.right(), d.bottom(), d.top())
cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (0, 255, 0), 2) # 對人臉畫框
face_descriptor = facerec.compute_face_descriptor(frame, shape) # 提取特征
v = numpy.array(face_descriptor)
# 將第一張人臉照片直接保存
if flag:
descriptors.append(v)
faces.append(frame)
flag = False
else:
sign = True # 用來標記當前人臉是否為新的
l = len(descriptors)
for i in range(l):
distance = numpy.linalg.norm(descriptors[i] - v) # 計算兩張臉的距離
# 取閾值0.5踏志,距離小于0.5則認為人臉已出現(xiàn)過
if distance < 0.5:
# print(faces[i].shape)
face_gray = cv2.cvtColor(faces[i], cv2.COLOR_BGR2GRAY)
# 比較兩張人臉的清晰度,保存更清晰的人臉
if cv2.Laplacian(gray, cv2.CV_64F).var() > cv2.Laplacian(face_gray, cv2.CV_64F).var():
faces[i] = frame
sign = False
break
# 如果是新的人臉則保存
if sign:
descriptors.append(v)
faces.append(frame)
cv2.imshow("人臉識別", frame) # 在窗口中顯示
index = cv2.waitKey(1)
if index == 27:
video.release()
cv2.destroyWindow("人臉識別")
break
suc,frame = video.read()
i += 1
print(len(descriptors)) # 輸出不同的人臉數(shù)
# 將不同的比較清晰的人臉照片輸出到本地
j = 1
for fc in faces:
cv2.imwrite(super_path + "/result/" + str(j) +".jpg", fc)
j += 1