【python+OpenCV+dlib】實現(xiàn)從視頻中檢測人臉數(shù)并保存最清晰的人臉

運行環(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/
如果對你有所幫助請點關注,謝謝!
提醒一下,2020年4月之前不要作為研究生結課作業(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幀截取一幀
        # 轉為灰度圖像處理
        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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容