wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4068|回復: 2
打印 上一主題 下一主題
收起左側

Python人臉識別+表情識別程序

[復制鏈接]
跳轉到指定樓層
樓主
本人參加比賽時用的人臉識別程序,功能包括人臉識別以及表情識別,表情識別可識別正常、開心、驚訝。能力有限,程序在檢測到人臉時刷新率不是很高,攝像頭畫面有點卡,但在攝像頭前沒有人臉時畫面還是很流暢的,這是由于人臉識別算法和表情識別需要花費太多的時間。

程序太大,無法上傳,我就直接貼出來了。

get_face_from_camera.py/從攝像頭獲取人臉
  1. # 進行人臉錄入 / Face register

  2. import dlib
  3. import numpy as np
  4. import cv2
  5. import os
  6. import shutil
  7. import time

  8. # Dlib 正向人臉檢測器 / Use frontal face detector of Dlib
  9. detector = dlib.get_frontal_face_detector()


  10. class Face_Register:
  11.     def __init__(self):
  12.         self.path_photos_from_camera = "data/data_faces_from_camera_my/"
  13.         self.font = cv2.FONT_ITALIC

  14.         self.existing_faces_cnt = 0         # 已錄入的人臉計數器 / cnt for counting saved faces
  15.         self.ss_cnt = 0                     # 錄入 personX 人臉時圖片計數器 / cnt for screen shots
  16.         self.current_frame_faces_cnt = 0    # 錄入人臉計數器 / cnt for counting faces in current frame

  17.         self.save_flag = 1                  # 之后用來控制是否保存圖像的 flag / The flag to control if save
  18.         self.press_n_flag = 0               # 之后用來檢查是否先按 'n' 再按 's' / The flag to check if press 'n' before 's'

  19.         # FPS
  20.         self.frame_time = 0
  21.         self.frame_start_time = 0
  22.         self.fps = 0

  23.     # 新建保存人臉圖像文件和數據CSV文件夾 / Make dir for saving photos and csv
  24.     def pre_work_mkdir(self):
  25.         # 新建文件夾 / Create folders to save faces images and csv
  26.         if os.path.isdir(self.path_photos_from_camera):
  27.             pass
  28.         else:
  29.             os.mkdir(self.path_photos_from_camera)

  30.     # 刪除之前存的人臉數據文件夾 / Delete the old data of faces
  31.     def pre_work_del_old_face_folders(self):
  32.         # 刪除之前存的人臉數據文件夾, 刪除 "/data_faces_from_camera/person_x/"...
  33.         folders_rd = os.listdir(self.path_photos_from_camera)
  34.         for i in range(len(folders_rd)):
  35.             shutil.rmtree(self.path_photos_from_camera+folders_rd[i])
  36.         if os.path.isfile("data/features_all.csv"):
  37.             os.remove("data/features_all.csv")

  38.     # 如果有之前錄入的人臉, 在之前 person_x 的序號按照 person_x+1 開始錄入 / Start from person_x+1
  39.     def check_existing_faces_cnt(self):
  40.         if os.listdir("data/data_faces_from_camera_my/"):
  41.             # 獲取已錄入的最后一個人臉序號 / Get the order of latest person
  42.             person_list = os.listdir("data/data_faces_from_camera_my/")
  43.             person_num_list = []
  44.             for person in person_list:
  45.                 person_num_list.append(int(person.split('_')[-1]))
  46.             self.existing_faces_cnt = max(person_num_list)

  47.         # 如果第一次存儲或者沒有之前錄入的人臉, 按照 person_1 開始錄入 / Start from person_1
  48.         else:
  49.             self.existing_faces_cnt = 0

  50.     # 獲取處理之后 stream 的幀數 / Update FPS of video stream
  51.     def update_fps(self):
  52.         now = time.time()
  53.         self.frame_time = now - self.frame_start_time
  54.         self.fps = 1.0 / self.frame_time
  55.         self.frame_start_time = now

  56.     # 生成的 cv2 window 上面添加說明文字 / PutText on cv2 window
  57.     def draw_note(self, img_rd):
  58.         # 添加說明 / Add some notes
  59.         cv2.putText(img_rd, "Face Register", (20, 40), self.font, 1, (255, 255, 255), 1, cv2.LINE_AA)
  60.         cv2.putText(img_rd, "FPS:   " + str(self.fps.__round__(2)), (20, 100), self.font, 0.8, (0, 255, 0), 1,
  61.                     cv2.LINE_AA)
  62.         cv2.putText(img_rd, "Faces: " + str(self.current_frame_faces_cnt), (20, 140), self.font, 0.8, (0, 255, 0), 1, cv2.LINE_AA)
  63.         cv2.putText(img_rd, "N: Create face folder", (20, 350), self.font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
  64.         cv2.putText(img_rd, "S: Save current face", (20, 400), self.font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
  65.         cv2.putText(img_rd, "Q: Quit", (20, 450), self.font, 0.8, (255, 255, 255), 1, cv2.LINE_AA)

  66.     # 獲取人臉 / Main process of face detection and saving
  67.     def process(self, stream):
  68.         # 1. 新建儲存人臉圖像文件目錄 / Create folders to save photos
  69.         global current_face_dir
  70.         self.pre_work_mkdir()

  71.         # 2. 刪除 "/data/data_faces_from_camera" 中已有人臉圖像文件 / Uncomment if want to delete the saved faces and start from person_1
  72.         if os.path.isdir(self.path_photos_from_camera):
  73.             self.pre_work_del_old_face_folders()

  74.         # 3. 檢查 "/data/data_faces_from_camera" 中已有人臉文件
  75.         self.check_existing_faces_cnt()

  76.         while stream.isOpened():
  77.             flag, img_rd = stream.read()        # Get camera video stream
  78.             kk = cv2.waitKey(1)
  79.             faces = detector(img_rd, 0)         # Use Dlib face detector

  80.             # 4. 按下 'n' 新建存儲人臉的文件夾 / Press 'n' to create the folders for saving faces
  81.             if kk == ord('n'):
  82.                 self.existing_faces_cnt += 1
  83.                 current_face_dir = self.path_photos_from_camera + "person_" + str(self.existing_faces_cnt)
  84.                 os.makedirs(current_face_dir)
  85.                 print('\n')
  86.                 print("新建的人臉文件夾 / Create folders: ", current_face_dir)

  87.                 self.ss_cnt = 0                 # 將人臉計數器清零 / Clear the cnt of screen shots
  88.                 self.press_n_flag = 1           # 已經按下 'n' / Pressed 'n' already

  89.             # 5. 檢測到人臉 / Face detected
  90.             if len(faces) != 0:
  91.                 # 矩形框 / Show the ROI of faces
  92.                 for k, d in enumerate(faces):
  93.                     # 計算矩形框大小 / Compute the size of rectangle box
  94.                     height = (d.bottom() - d.top())
  95.                     width = (d.right() - d.left())
  96.                     hh = int(height/2)
  97.                     ww = int(width/2)

  98.                     # 6. 判斷人臉矩形框是否超出 480x640 / If the size of ROI > 480x640
  99.                     if (d.right()+ww) > 640 or (d.bottom()+hh > 480) or (d.left()-ww < 0) or (d.top()-hh < 0):
  100.                         cv2.putText(img_rd, "OUT OF RANGE", (20, 300), self.font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
  101.                         color_rectangle = (0, 0, 255)
  102.                         save_flag = 0
  103.                         if kk == ord('s'):
  104.                             print("請調整位置 / Please adjust your position")
  105.                     else:
  106.                         color_rectangle = (255, 255, 255)
  107.                         save_flag = 1

  108.                     cv2.rectangle(img_rd,
  109.                                   tuple([d.left() - ww, d.top() - hh]),
  110.                                   tuple([d.right() + ww, d.bottom() + hh]),
  111.                                   color_rectangle, 2)

  112.                     # 7. 根據人臉大小生成空的圖像 / Create blank image according to the size of face detected
  113.                     img_blank = np.zeros((int(height*2), width*2, 3), np.uint8)

  114.                     if save_flag:
  115.                         # 8. 按下 's' 保存攝像頭中的人臉到本地 / Press 's' to save faces into local images
  116.                         if kk == ord('s'):
  117.                             # 檢查有沒有先按'n'新建文件夾 / Check if you have pressed 'n'
  118.                             if self.press_n_flag:
  119.                                 self.ss_cnt += 1
  120.                                 for ii in range(height*2):
  121.                                     for jj in range(width*2):
  122.                                         img_blank[ii][jj] = img_rd[d.top()-hh + ii][d.left()-ww + jj]
  123.                                 cv2.imwrite(current_face_dir + "/img_face_" + str(self.ss_cnt) + ".jpg", img_blank)
  124.                                 print("寫入本地 / Save into:", str(current_face_dir) + "/img_face_" + str(self.ss_cnt) + ".jpg")
  125.                             else:
  126.                                 print("請先按 'N' 來建文件夾, 按 'S' / Please press 'N' and press 'S'")

  127.             self.current_frame_faces_cnt = len(faces)

  128.             # 9. 生成的窗口添加說明文字 / Add note on cv2 window
  129.             self.draw_note(img_rd)

  130.             # 10. 按下 'q' 鍵退出 / Press 'q' to exit
  131.             if kk == ord('q'):
  132.                 break

  133.             # 11. Update FPS
  134.             self.update_fps()

  135.             cv2.namedWindow("camera", 1)
  136.             cv2.imshow("camera", img_rd)

  137.     def run(self):
  138.         cap = cv2.VideoCapture(0)
  139.         self.process(cap)

  140.         cap.release()
  141.         cv2.destroyAllWindows()


  142. def main():
  143.     Face_Register_con = Face_Register()
  144.     Face_Register_con.run()


  145. if __name__ == '__main__':
  146.     main()
復制代碼




feature.py/提取保存的照片的特征
  1. # 從人臉圖像文件中提取人臉特征存入 "features_all.csv" / Extract features from images and save into "features_all.csv"

  2. import os
  3. import dlib
  4. from skimage import io
  5. import csv
  6. import numpy as np

  7. # 要讀取人臉圖像文件的路徑 / Path of cropped faces
  8. path_images_from_camera = "data/data_faces_from_camera/"

  9. # Dlib 正向人臉檢測器 / Use frontal face detector of Dlib
  10. detector = dlib.get_frontal_face_detector()

  11. # Dlib 人臉 landmark 特征點檢測器 / Get face landmarks
  12. predictor = dlib.shape_predictor('data/data_dlib/shape_predictor_68_face_landmarks.dat')

  13. # Dlib Resnet 人臉識別模型,提取 128D 的特征矢量 / Use Dlib resnet50 model to get 128D face descriptor
  14. face_reco_model = dlib.face_recognition_model_v1("data/data_dlib/dlib_face_recognition_resnet_model_v1.dat")


  15. # 返回單張圖像的 128D 特征 / Return 128D features for single image
  16. # Input:    path_img           <class 'str'>
  17. # Output:   face_descriptor    <class 'dlib.vector'>
  18. def return_128d_features(path_img):
  19.     img_rd = io.imread(path_img)
  20.     faces = detector(img_rd, 1)

  21.     print("%-40s %-20s" % ("檢測到人臉的圖像 / Image with faces detected:", path_img), '\n')

  22.     # 因為有可能截下來的人臉再去檢測,檢測不出來人臉了, 所以要確保是 檢測到人臉的人臉圖像拿去算特征
  23.     # For photos of faces saved, we need to make sure that we can detect faces from the cropped images
  24.     if len(faces) != 0:
  25.         shape = predictor(img_rd, faces[0])
  26.         face_descriptor = face_reco_model.compute_face_descriptor(img_rd, shape)
  27.     else:
  28.         face_descriptor = 0
  29.         print("no face")
  30.     return face_descriptor


  31. # 返回 personX 的 128D 特征均值 / Return the mean value of 128D face descriptor for person X
  32. # Input:    path_faces_personX       <class 'str'>
  33. # Output:   features_mean_personX    <class 'numpy.ndarray'>
  34. def return_features_mean_personX(path_faces_personX):
  35.     features_list_personX = []
  36.     photos_list = os.listdir(path_faces_personX)
  37.     if photos_list:
  38.         for i in range(len(photos_list)):
  39.             # 調用 return_128d_features() 得到 128D 特征 / Get 128D features for single image of personX
  40.             print("%-40s %-20s" % ("正在讀的人臉圖像 / Reading image:", path_faces_personX + "/" + photos_list[i]))
  41.             features_128d = return_128d_features(path_faces_personX + "/" + photos_list[i])
  42.             # 遇到沒有檢測出人臉的圖片跳過 / Jump if no face detected from image
  43.             if features_128d == 0:
  44.                 i += 1
  45.             else:
  46.                 features_list_personX.append(features_128d)
  47.     else:
  48.         print("文件夾內圖像文件為空 / Warning: No images in " + path_faces_personX + '/', '\n')

  49.     # 計算 128D 特征的均值 / Compute the mean
  50.     # personX 的 N 張圖像 x 128D -> 1 x 128D
  51.     if features_list_personX:
  52.         features_mean_personX = np.array(features_list_personX).mean(axis=0)
  53.     else:
  54.         features_mean_personX = np.zeros(128, dtype=int, order='C')
  55.     print(type(features_mean_personX))
  56.     return features_mean_personX


  57. # 獲取已錄入的最后一個人臉序號 / Get the order of latest person
  58. person_list = os.listdir("data/data_faces_from_camera/")
  59. person_num_list = []
  60. for person in person_list:
  61.     person_num_list.append(int(person.split('_')[-1]))
  62. person_cnt = max(person_num_list)

  63. with open("data/features_all.csv", "w", newline="") as csvfile:
  64.     writer = csv.writer(csvfile)
  65.     for person in range(person_cnt):
  66.         # Get the mean/average features of face/personX, it will be a list with a length of 128D
  67.         print(path_images_from_camera + "person_" + str(person + 1))
  68.         features_mean_personX = return_features_mean_personX(path_images_from_camera + "person_" + str(person + 1))
  69.         writer.writerow(features_mean_personX)
  70.         print("特征均值 / The mean of features:", list(features_mean_personX))
  71.         print('\n')
  72.     print("所有錄入人臉數據存入 / Save all the features of faces registered into: data/features_all.csv")
復制代碼


main.py/主程序
  1. import dlib
  2. import cv2
  3. import os
  4. import time
  5. import numpy as np
  6. import pandas as pd
  7. from PIL import Image

  8. # 正向人臉檢測器
  9. detector = dlib.get_frontal_face_detector()

  10. # 特征點檢測器
  11. predictor = dlib.shape_predictor('data/data_dlib/shape_predictor_68_face_landmarks.dat')

  12. # 人臉識別模型,提取 128D 的特征矢量
  13. face_reco_model = dlib.face_recognition_model_v1("data/data_dlib/dlib_face_recognition_resnet_model_v1.dat")


  14. class Face_Recognizer:
  15.     def __init__(self):
  16.         self.feature_known_list = []                # 用來存放所有錄入人臉特征的數組
  17.         self.name_known_list = []                   # 存儲錄入人臉名字

  18.         self.current_frame_face_cnt = 0             # 存儲當前攝像頭中捕獲到的人臉數
  19.         self.current_frame_feature_list = []        # 存儲當前攝像頭中捕獲到的人臉特征
  20.         self.current_frame_name_position_list = []  # 存儲當前攝像頭中捕獲到的所有人臉的名字坐標
  21.         self.current_frame_name_list = []           # 存儲當前攝像頭中捕獲到的所有人臉的名字

  22.         # Update FPS
  23.         self.fps = 0
  24.         self.frame_start_time = 0

  25.     # 讀取錄入人臉特征
  26.     def get_face_database(self):
  27.         if os.path.exists("data/features_all.csv"):
  28.             path_features_known_csv = "data/features_all.csv"
  29.             csv_rd = pd.read_csv(path_features_known_csv, header=None)
  30.             for i in range(csv_rd.shape[0]):
  31.                 features_someone_arr = []
  32.                 for j in range(0, 128):
  33.                     if csv_rd.iloc[i][j] == '':
  34.                         features_someone_arr.append('0')
  35.                     else:
  36.                         features_someone_arr.append(csv_rd.iloc[i][j])
  37.                 self.feature_known_list.append(features_someone_arr)
  38.                 self.name_known_list.append("Person_"+str(i+1))
  39.             print("人臉庫中的人臉數:", len(self.feature_known_list))
  40.             return 1
  41.         else:
  42.             print('##### Warning #####', '\n')
  43.             print("'features_all.csv' not found!")
  44.             print(
  45.                 "Please run 'get_faces_from_camera.py' and 'features.py' before 'main.py'",
  46.                 '\n')
  47.             print('##### End Warning #####')
  48.             return 0

  49.     # 計算兩個128D向量間的歐式距離
  50.     @staticmethod
  51.     def return_euclidean_distance(feature_1, feature_2):
  52.         feature_1 = np.array(feature_1)
  53.         feature_2 = np.array(feature_2)
  54.         dist = np.sqrt(np.sum(np.square(feature_1 - feature_2)))
  55.         return dist

  56.     # 更新 FPS
  57.     def update_fps(self):
  58.         now = time.time()
  59.         self.frame_time = now - self.frame_start_time
  60.         self.fps = 1.0 / self.frame_time
  61.         self.frame_start_time = now

  62.     def draw_note(self, img_rd):
  63.         cv2.putText(img_rd, "Face number: " + str(self.current_frame_face_cnt), (20, 40), cv2.FONT_HERSHEY_SIMPLEX,
  64.                         1, (0, 0, 255), 2, 4)
  65.         for i in range(self.current_frame_face_cnt):
  66.             cv2.putText(img_rd, "person: "+str(self.current_frame_name_list[i]), (20, 120), cv2.FONT_HERSHEY_SIMPLEX,
  67.                         1, (0, 0, 255), 2, 4)

  68.     def draw_name(self, img_rd):
  69.         # 在人臉框下面寫人臉名字
  70.         global img_with_name
  71.         img = Image.fromarray(cv2.cvtColor(img_rd, cv2.COLOR_BGR2RGB))
  72.         # draw = ImageDraw.Draw(img)
  73.         for i in range(self.current_frame_face_cnt):
  74.             img_with_name = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
  75.         return img_with_name

  76.     # 修改顯示人名
  77.     def show_chinese_name(self):
  78.         # Default known name: person_1, person_2, person_3
  79.         if self.current_frame_face_cnt >= 1:
  80.             self.name_known_list[0] = 'xiaoyu'
  81.             self.name_known_list[1] = 'xiaohui'
  82.             self.name_known_list[2] = 'xiaochen'
  83.             self.name_known_list[3] = 'xiaorui'
  84.             self.name_known_list[4] = 'xiaomu'
  85.             self.name_known_list[5] = 'xiaoman'

  86.     # 處理獲取的視頻流,進行人臉識別
  87.     def process(self, stream):
  88.         a = 100
  89.         m = 0
  90.         # 1. 讀取存放所有人臉特征的 csv
  91.         if self.get_face_database():
  92.             while stream.isOpened():
  93.                 flag, img_rd = stream.read()
  94.                 faces = detector(img_rd, 0)
  95.                 kk = cv2.waitKey(1)
  96.                 # 按下 q 鍵退出
  97.                 if kk == ord('q'):
  98.                     break
  99.                 else:
  100.                     self.draw_note(img_rd)
  101.                     self.current_frame_feature_list = []
  102.                     self.current_frame_face_cnt = 0
  103.                     self.current_frame_name_position_list = []
  104.                     self.current_frame_name_list = []

  105.                     # 2. 檢測到人臉
  106.                     if len(faces) != 0:
  107.                         # 3. 獲取當前捕獲到的圖像的所有人臉的特征
  108.                         for i in range(len(faces)):
  109.                             shape = predictor(img_rd, faces[i])
  110.                             self.current_frame_feature_list.append(face_reco_model.compute_face_descriptor(img_rd, shape))
  111.                         # 4. 遍歷捕獲到的圖像中所有的人臉
  112.                         for k in range(len(faces)):
  113.                             # 先默認所有人不認識,是 unknown
  114.                             self.current_frame_name_list.append("unknown")

  115.                             # 每個捕獲人臉的名字坐標
  116.                             self.current_frame_name_position_list.append(tuple(
  117.                                 [faces[k].left(), int(faces[k].bottom() + (faces[k].bottom() - faces[k].top()) / 4)]))

  118.                             # 5. 對于某張人臉,遍歷所有存儲的人臉特征
  119.                             current_frame_e_distance_list = []
  120.                             for i in range(len(self.feature_known_list)):
  121.                                 # 如果 person_X 數據不為空
  122.                                 if str(self.feature_known_list[i][0]) != '0.0':
  123.                                     e_distance_tmp = self.return_euclidean_distance(self.current_frame_feature_list[k],
  124.                                                                                     self.feature_known_list[i])
  125.                                     # print(e_distance_tmp)
  126.                                     current_frame_e_distance_list.append(e_distance_tmp)
  127.                                 else:
  128.                                     # 空數據 person_X
  129.                                     current_frame_e_distance_list.append(999999999)
  130.                             # 6. 尋找出最小的歐式距離匹配
  131.                             similar_person_num = current_frame_e_distance_list.index(min(current_frame_e_distance_list))

  132.                             if min(current_frame_e_distance_list) < 0.4:
  133.                                 self.current_frame_name_list[k] = self.name_known_list[similar_person_num]
  134.                                 a = similar_person_num

  135.                             else:
  136.                                 a = 7
  137.                             n = m
  138.                             m = self.face_emotion(stream)
  139.                             if a == 0:
  140.                                 print("識別結果:小玉")
  141.                             elif a == 1:
  142.                                 print("識別結果:小惠")
  143.                             elif a == 2:
  144.                                 print("識別結果:小晨")
  145.                             elif a == 3:
  146.                                 print("識別結果:小銳")
  147.                             elif a == 4:
  148.                                 print("識別結果:小木")
  149.                             elif a == 5:
  150.                                 print("識別結果:小滿")
  151.                             elif a == 7:
  152.                                 print("識別結果:陌生人")
  153.                             # print(min(current_frame_e_distance_list))
  154.                             if m == 1:
  155.                                 print("表情:正常\n\n")
  156.                                 cv2.putText(img_rd, "emotion: nature", (20, 80), cv2.FONT_HERSHEY_SIMPLEX,
  157.                                                 1, (0, 0, 255), 2, 4)
  158.                             elif m == 2:
  159.                                 print("表情:開心\n\n")
  160.                                 cv2.putText(img_rd, "emotion: happy", (20, 80), cv2.FONT_HERSHEY_SIMPLEX,
  161.                                                 1, (0, 0, 255), 2, 4)
  162.                             elif m == 3:
  163.                                 print("表情:驚訝\n\n")
  164.                                 cv2.putText(img_rd, "emotion: amazing", (20, 80), cv2.FONT_HERSHEY_SIMPLEX,
  165.                                                 1, (0, 0, 255), 2, 4)
  166.                             # 矩形框
  167.                             for kk, d in enumerate(faces):
  168.                                 # 繪制矩形框
  169.                                 cv2.rectangle(img_rd, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]),
  170.                                               (0, 255, 255), 2)

  171.                         self.current_frame_face_cnt = len(faces)

  172.                         # 7. 在這里更改顯示的人名
  173.                         self.show_chinese_name()

  174.                         # 8. 寫名字
  175.                         img_with_name = self.draw_name(img_rd)

  176.                     else:
  177.                         print("無人臉\n")
  178.                         img_with_name = img_rd

  179.                 cv2.imshow("camera", img_with_name)

  180.                 # 9. 更新 FPS
  181.                 # self.update_fps()
  182.                 print("\n")

  183.     # OpenCV 調用攝像頭并進行 process
  184.     def run(self):
  185.         cap = cv2.VideoCapture(0)
  186.         cap.set(3, 480)     # 640x480
  187.         self.process(cap)

  188.         cap.release()
  189.         cv2.destroyAllWindows()

  190.     def face_emotion(self, cap):
  191.         a = 0
  192.         line_brow_x = []
  193.         line_brow_y = []
  194.         detector = dlib.get_frontal_face_detector()
  195.         flag, im_rd = cap.read()
  196.         # 每幀數據延時1ms,延時為0讀取的是靜態幀
  197.         k = cv2.waitKey(1)
  198.         # 取灰度
  199.         img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)
  200.         # 使用人臉檢測器檢測每一幀圖像中的人臉。并返回人臉數rects
  201.         faces = detector(img_gray, 0)
  202.         # 待會要顯示在屏幕上的字體
  203.         # 如果檢測到人臉
  204.         if (len(faces) != 0):
  205.             # 對每個人臉都標出68個特征點
  206.             for i in range(len(faces)):
  207.                 # enumerate方法同時返回數據對象的索引和數據,k為索引,d為faces中的對象
  208.                 for k, d in enumerate(faces):
  209.                     # 用紅色矩形框出人臉
  210.                     cv2.rectangle(im_rd, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255))
  211.                     # 計算人臉熱別框邊長
  212.                     face_width = d.right() - d.left()
  213.                     # 使用預測器得到68點數據的坐標
  214.                     shape = predictor(im_rd, d)
  215.                     # 分析任意n點的位置關系來作為表情識別的依據
  216.                     mouth_width = (shape.part(54).x - shape.part(48).x) / face_width  # 嘴巴咧開程度
  217.                     mouth_higth = (shape.part(66).y - shape.part(62).y) / face_width  # 嘴巴張開程度
  218.                     # 通過兩個眉毛上的10個特征點,分析挑眉程度和皺眉程度
  219.                     brow_sum = 0  # 高度之和
  220.                     frown_sum = 0  # 兩邊眉毛距離之和
  221.                     for j in range(17, 21):
  222.                         brow_sum += (shape.part(j).y - d.top()) + (shape.part(j + 5).y - d.top())
  223.                         frown_sum += shape.part(j + 5).x - shape.part(j).x
  224.                         line_brow_x.append(shape.part(j).x)
  225.                         line_brow_y.append(shape.part(j).y)
  226.                     # self.brow_k, self.brow_d = self.fit_slr(line_brow_x, line_brow_y)  # 計算眉毛的傾斜程度
  227.                     tempx = np.array(line_brow_x)
  228.                     tempy = np.array(line_brow_y)
  229.                     z1 = np.polyfit(tempx, tempy, 1)  # 擬合成一次直線
  230.                     # brow_k = -round(float(z1[0]), 4)  # 擬合出曲線的斜率和實際眉毛的傾斜方向是相反的
  231.                     # print(self.brow_k)
  232.                     # brow_hight = (brow_sum / 10) / face_width  # 眉毛高度占比
  233.                     # brow_width = (frown_sum / 5) / face_width  # 眉毛距離占比
  234.                     # 眼睛睜開程度
  235.                     eye_sum = (shape.part(41).y - shape.part(37).y + shape.part(40).y - shape.part(38).y +
  236.                                shape.part(47).y - shape.part(43).y + shape.part(46).y - shape.part(44).y)
  237.                     eye_hight = (eye_sum / 4) / face_width
  238.                     # print("眼睛睜開距離與識別框高度之比:",round(eye_open/self.face_width,3))

  239.                     # 分情況討論
  240.                     # 張嘴,可能是開心或者驚訝
  241.                     if round(mouth_higth >= 0.05):
  242.                         if eye_hight >= 0.038:
  243.                             cv2.putText(im_rd, "amazing", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX,
  244.                                         0.8, (0, 0, 255), 2, 4)
  245.                             flag_d = 3
  246.                         else:
  247.                             cv2.putText(im_rd, "happy", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
  248.                                         (0, 0, 255), 2, 4)
  249.                             flag_d = 2

  250.                     # 沒有張嘴,可能是正常和生氣
  251.                     else:
  252.                         if mouth_width > 0.39:
  253.                             cv2.putText(im_rd, "happy", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
  254.                                         (0, 0, 255), 2, 4)
  255.                             flag_d = 2
  256.                         else:
  257.                             cv2.putText(im_rd, "nature", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
  258.                                         (0, 0, 255), 2, 4)
  259.                             flag_d = 1
  260.                     return flag_d

  261. def main():
  262.     Face_Recognizer_con = Face_Recognizer()
  263.     Face_Recognizer_con.run()


  264. if __name__ == '__main__':
  265.     main()
復制代碼



zBdeE2Uvp6.png (29.26 KB, 下載次數: 197)

整個文件內容

整個文件內容

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:328014 發表于 2020-12-21 00:46 | 只看該作者
好東東 可惜源碼沒上傳成功 是大于20兆了嗎?用7z壓縮率比較高
回復

使用道具 舉報

板凳
ID:871765 發表于 2021-1-1 13:03 | 只看該作者
請教能不能做一款在一群人里面,識別出其中任意一個人對著鏡頭做“合十膜拜”的動作,要求低成本的單板,有酬任務,謝謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
69免费视频| 国产欧美日韩不卡| 日韩在线视频观看免费| 国产四区在线观看| 亚洲一区二区三区香蕉| 97在线视频免费播放| 久久综合久久综合久久| 老司机午夜精品| 视频精品一区| 国产三级一区| 国内视频自拍在线视频| 欧洲精品乱码久久久久蜜桃| 成人网6969conwww| 欧美精品一区二区蜜桃| 中文字幕有码在线播放| 亚洲一区二区三区综合| 7788色淫网站小说| 国产精品久久久免费观看| 交换做爰国语对白| 久久亚洲高清| av资源中文色综合| 亚洲图色中文字幕| 亚洲va久久久噜噜噜久久狠狠| 久久视频免费在线播放| 国产中文字幕精品| 台湾佬成人网| 深夜福利视频在线免费观看| 日韩女同强女同hd| 日本黄色播放器| 午夜精品一区二区三区在线| 日韩一区二区三区免费看| 欧美一区=区| 蜜芽在线免费观看| 狠狠搞狠狠干| 好吊视频一区二区三区| 欧美久久久久久久久久久久| 免费黄频在线观看| 国产精品video| 国产亚洲视频在线| 欧美激情综合在线| 久久亚洲二区| 成人羞羞网站入口| 高清一区二区| 国产亚洲成av人片在线观看 | 91免费福利视频| 欧美性极品xxxx做受| 91老师国产黑色丝袜在线| 一区二区三区国产在线| av综合电影网站| 天堂在线视频播放| 日本年轻的继坶中文字幕| 欧美性受xxx黑人xyx性爽| 国模雨婷捆绑高清在线| 免费在线观看av电影| 欧美xo影院| 精品一区二区三区在线观看视频| 蜜桃久久久久久久| 国产精品观看| 中文不卡1区2区3区| 免费看黄资源大全高清| 亚洲 欧美 激情 另类| 激情高潮到大叫狂喷水| 久久av喷吹av高潮av| 狠狠色噜噜狠狠狠888奇米| 4虎在线播放1区| 国产无套粉嫩白浆在线2022年| 国产麻豆剧果冻传媒观看hd高清| 男人天堂网站| 欧美亚韩一区二区三区| 久久久精品高清| 久久久久国产免费| 欧美极品jizzhd欧美18| 天天干中文字幕| 人人爽人人爽人人片av| 熟妇高潮一区二区高潮| 性无码专区无码| 中文精品久久久久人妻不卡| 亚洲欧洲视频在线观看| 熟年交尾五十路视频在线播放| 男捅女免费视频| 在线视频资源站| 在线免费观看av影视天堂| 亚洲成人天堂| 123区在线| 开心激情综合| 97一区二区国产好的精华液| 亚洲a在线视频| 神马久久精品| 97人人做人人爽香蕉精品| 精品国产aⅴ| 久久99精品一区二区三区三区| 日本一区二区不卡视频| 欧美久久免费观看| 疯狂做受xxxx高潮欧美日本| 亚洲国产精品va在看黑人| 97色在线播放视频| 日本在线视频一区| 亚洲成熟丰满熟妇高潮xxxxx| xxxx黄色片| 97人妻精品视频一区| 精品人妻一区二区三区麻豆91| 国产不卡精品一区二区三区| 桃花色综合影院| 日本精品在线中文字幕| 偷拍自拍在线看| 日韩综合网站| 99精品免费视频| 国产偷国产偷精品高清尤物| 欧美狂野另类xxxxoooo| 久久久久久久久久久亚洲| 久久综合中文色婷婷| 九九热免费精品视频| 久久久久久久麻豆| 国产精品多人| 天天综合网91| 奇米色一区二区| 成人午夜av电影| 日本一区二区三区在线观看| 一区二区三区在线观看国产| 亚洲综合色噜噜狠狠| 人与动物性xxxx| 视频一区在线视频| 亚洲激情在线观看视频| 91精品在线观看国产| 国产区在线观看| 欧美69xx性欧美| 五十路亲子中出在线观看| 又黄又免费的网站| 国产免费自拍视频| 成人亚洲在线观看| 国产网站av| aⅴ在线视频男人的天堂| gogo久久| 国产999精品在线观看| 久久av电影| 国产精品亚洲产品| 久久中文字幕一区二区| 欧美五码在线| 欧美日韩一区二区三区在线电影| 精品中文字幕一区二区三区av| 国内久久视频| 国产成人午夜视频| 亚洲国产另类精品专区| 欧美一区二区精品在线| 91精品1区2区| 在线观看亚洲精品| 欧美午夜精品| 日韩不卡一区二区三区| 中文亚洲字幕| 不卡视频一二三四| 国产欧美日韩卡一| 欧美视频一区二区三区四区| 中文字幕在线观看亚洲| 国产日韩专区在线| 亚洲免费av网| 青青草久久伊人| 成年人二级毛片| 隣の若妻さん波多野结衣| 伊人影院在线观看| free欧美性| 国产中文字幕在线看| 青青在线精品| 激情欧美一区| 国产精品日韩精品欧美在线| 日韩一区二区电影网| 97视频免费看| 一本一道久久久a久久久精品91| 亚洲18在线看污www麻豆| 免费观看一级视频| 欧美黄网站色视频| 国产成人综合美国十次| 97在线超碰| 99热国内精品永久免费观看| av不卡一区二区三区| 91啦中文在线观看| 在线观看三级视频欧美| 色综合天天狠天天透天天伊人| 好吊色欧美一区二区三区视频| 黄色a级片免费| 国产亚洲成人精品| 国精品日韩欧美一区二区三区| 深夜福利视频在线免费观看| 日本一区二区三区播放| 久久av在线| 亚洲成av人片在线| 视频在线观看99| 日本在线成人一区二区| 九色91国产| 中文字幕乱码在线| 日本男人天堂网| 久久不射影院| 久久久亚洲人| 7777精品伊人久久久大香线蕉最新版 | 日本成人黄色片| 成年人黄色片视频| 一级日韩一级欧美| 欧美色图另类| 亚洲综合色站| 日韩欧美国产成人| 91免费看国产| 久久久久无码精品国产sm果冻| 天天操狠狠操夜夜操| www.四虎在线观看| 日本中文字幕在线观看| 亚洲精品日本| 91麻豆精品国产91久久久资源速度| 成人网欧美在线视频| 成人手机在线免费视频| 在线观看91| 免费观看亚洲视频大全| 国产视频在线观看一区二区三区| 久久国产色av| 国产原创精品在线| 九九九免费视频| 99热在线免费播放| 色综合中文网| 亚洲国产乱码最新视频 | 免费黄色片网站| 成年女人色毛片免费| 伦理一区二区| 亚洲在线中文字幕| 91福利入口| 制服丝袜综合网| 久久精品偷拍视频| 天天撸夜夜操| 亚洲尤物av| 同产精品九九九| 99国产在线| 国产在线视频卡一卡二| 在线观影网站| 国产美女一区| 亚洲码在线观看| 成人黄色一区二区| 性欧美videos粗暴| julia中文字幕一区二区99在线| 亚洲男人的天堂在线观看| 91精品久久久久久久久久久久久久| 永久免费成人代码| 成年人福利视频| 欧美阿v一级看视频| 亚洲卡通欧美制服中文| 91精品国产综合久久香蕉最新版| 在线观看免费小视频| 麻豆一区二区三区四区精品蜜桃| 欧美一区激情| 亚洲精品aⅴ中文字幕乱码| 男人揉女人奶房视频60分| 最近中文av字幕在线中文| 精品国产亚洲一区二区在线观看 | 丰满少妇又爽又紧又丰满电影| 国产精品羞羞答答在线观看| 欧美一a一片一级一片| 亚洲国产日韩欧美| 午夜久久久久久久久久| 成人在线视频国产| 五月综合激情网| 亚洲国产午夜伦理片大全在线观看网站 | 国产精品99导航| 伊人影院综合网| 在线黄色.com| 久久国产人妖系列| 97在线视频免费| 日本精品人妻无码77777| www污网站在线观看| 国产精品不卡| 精品网站999www| 亚洲制服在线观看| 久草香蕉在线| 久久久xxx| 久久久久成人精品| 亚洲欧美另类日本| 欧美性猛交xxx乱大交3蜜桃| www.欧美色图| 91久久精品www人人做人人爽 | 里番在线观看网站| 久久香蕉国产线看观看99| 91久久精品国产91性色| 久久亚洲精品石原莉奈| 欧美va视频| 色悠悠久久综合| 日韩av三级在线| 狠狠搞狠狠干| 三级久久三级久久| 日韩av电影院| caoporn国产| 国产一区二区主播在线| 精品久久久久久久大神国产| 18禁裸男晨勃露j毛免费观看| 另类国产精品一区二区| 亚洲精品二区三区| 欧美麻豆久久久久久中文| 国产一二三四区| 国产福利电影在线播放| 天天综合天天做天天综合| 国产96在线 | 亚洲| 7777在线| 国产精品乡下勾搭老头1| 91精品免费视频| 精品国产亚洲av麻豆| 色愁久久久久久| 亚洲精品美女在线观看播放| 白丝女仆被免费网站| 欧美午夜电影一区二区三区| 一区二区三区精品在线| 亚洲国产精品无码观看久久| www成人免费观看网站| 久久激情五月激情| 高清国产在线一区| 午夜一区在线观看| 亚洲欧美文学| 日本成人免费在线| 在线观看中文字幕码| 久久毛片亚洲| 91福利在线观看| 国产精品久久久久久久99| 一级片在线播放| 日韩美女精品在线| 超碰97人人人人人蜜桃| 五月婷婷六月色| 亚洲片区在线| 成人国产精品免费视频 | 国产伊人久久| 欧美精品一区二区三区久久久| 给我看免费高清在线观看| 91丝袜在线| 欧美精品久久久久久久久老牛影院| 免费观看污网站| 男人天堂亚洲天堂 | 永久免费网站视频在线观看| 色先锋资源在线播放av| 成人一区二区三区在线观看| 亚洲一区二区免费视频软件合集| www.黄在线| 久久综合久久99| 欧美大片在线播放| 麻豆导航在线观看| 精品国产成人在线| youjizz.com日本| 91色在线看| 91精品国产免费久久综合| 国产探花视频在线播放| 91视频成人| 俺也去精品视频在线观看| 国产精品欧美综合| 一区二区三区四区日韩| 91九色国产视频| 豆国产97在线|亚洲| 不卡视频一二三| av免费在线播放网站| 午夜成年人在线免费视频| 亚洲一区二区欧美激情| 91日韩精品视频| 国产盗摄精品一区二区酒店| 制服丝袜亚洲精品中文字幕| 亚洲午夜久久久久久久国产| 免费精品一区| 97精品国产91久久久久久| 五月婷婷在线播放| 国产精品主播直播| 少妇大叫太大太粗太爽了a片小说| 在线播放av网站| 色视频欧美一区二区三区| 国内精品卡一卡二卡三| 国产精品玖玖玖在线资源| 91国产高清在线| 一区二区精品区| 国产女优一区| 免费在线成人av| 传媒在线观看| 色综合久久中文字幕| 91精品久久久久久久久久久久| 亚洲一区二区三区中文字幕在线观看| 老司机一区二区| 久久香蕉视频网站| 在线免费看黄| 欧美变态tickle挠乳网站| 国产性70yerg老太| 午夜日韩av| 日本福利一区二区三区| 草莓污污视频在线观看| 色吊一区二区三区| 国产精品白嫩白嫩大学美女| 99久久精品国产亚洲精品| www.一区二区三区| 成年人免费看的视频| 色婷婷狠狠综合| 青娱乐国产在线视频| 亚洲成av人电影| 蜜桃传媒视频麻豆第一区免费观看 | 国产精品 欧美 日韩| 天天av综合| 日本欧美色综合网站免费| 深夜福利视频在线免费观看| 日韩欧美国产电影| 国产免费一区二区三区最新不卡 | 亚洲精品毛片一区二区三区| 久久一区中文字幕| 拔插拔插海外华人免费| 激情黄产视频在线免费观看| 欧美激情在线一区|