| @@ -0,0 +1,123 @@ | |||
| #!/usr/bin/env python3 | |||
| import cv2 | |||
| import numpy as np | |||
| import face_recognition | |||
| import os | |||
| import sys | |||
| import time | |||
| def match(path, cap): | |||
| face = face_recognition.load_image_file(path) | |||
| faceencs = face_recognition.face_encodings(face) | |||
| if len(faceencs) == 0: | |||
| print("Oh noes, bad face!") | |||
| exit(1) | |||
| faceenc = faceencs[0] | |||
| matching = False | |||
| while not matching: | |||
| ret, frame = cap.read() | |||
| if cv2.mean(frame)[0] < 30: | |||
| continue | |||
| scale = 0.25 | |||
| rgb_frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB) | |||
| small_rgb_frame = cv2.resize(rgb_frame, (0, 0), fx=scale, fy=scale) | |||
| framelocs = face_recognition.face_locations(small_rgb_frame) | |||
| frameencs = face_recognition.face_encodings(small_rgb_frame, framelocs) | |||
| # Loop through each face in this frame of video | |||
| for (top, right, bottom, left), frameenc in zip(framelocs, frameencs): | |||
| # See if the face is a match for the known face(s) | |||
| dist = face_recognition.face_distance([faceenc], frameenc)[0] | |||
| print("Distance: "+str(dist)) | |||
| cv2.rectangle( | |||
| rgb_frame, | |||
| (int(left / scale), int(top / scale)), | |||
| (int(right / scale), int(bottom / scale)), | |||
| (0, 0, 255), 2) | |||
| # If a match was found in known_face_encodings, just use the first one. | |||
| if dist <= 0.35: | |||
| matching = True | |||
| cv2.imshow("frame", rgb_frame) | |||
| if cv2.waitKey(1) & 0xFF == ord('q'): | |||
| break | |||
| # When everything done, release the capture | |||
| cap.release() | |||
| cv2.destroyAllWindows() | |||
| if matching: | |||
| print("Matches") | |||
| exit(0) | |||
| else: | |||
| exit(1) | |||
| def record(path, cap): | |||
| def draw_face_rec(name, frame): | |||
| rgb_frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB) | |||
| framelocs = face_recognition.face_locations(rgb_frame) | |||
| frameencs = face_recognition.face_encodings(rgb_frame, framelocs) | |||
| for (top, right, bottom, left), frameenc in zip(framelocs, frameencs): | |||
| cv2.rectangle(rgb_frame, (left, top), (right, bottom), (0, 0, 255), 2) | |||
| cv2.imshow(name, rgb_frame) | |||
| while True: | |||
| ret, frame = cap.read() | |||
| if cv2.mean(frame)[0] < 30: | |||
| continue | |||
| cv2.imshow("frame", frame) | |||
| key = cv2.waitKey(1) & 0xFF | |||
| if key == ord('q'): | |||
| break | |||
| elif key == ord('\r'): | |||
| cv2.imshow("frame", frame) | |||
| cv2.waitKey(1) | |||
| draw_face_rec("frame", frame) | |||
| while True: | |||
| key = cv2.waitKey(0) & 0xFF | |||
| if key == ord('\r'): | |||
| cv2.imwrite(path, frame) | |||
| return | |||
| elif key == 27: # esc | |||
| break | |||
| def usage(argv0): | |||
| print("Usage: "+argv0+" match <path> [cam ID]") | |||
| print(" "+argv0+" record <path> [cam ID]") | |||
| if len(sys.argv) < 2: | |||
| usage(sys.argv[0]) | |||
| exit(1) | |||
| if sys.argv[1] == "match": | |||
| if len(sys.argv) == 3: | |||
| capid = 2 | |||
| elif len(sys.argv) == 4: | |||
| capid = int(sys.argv[3]) | |||
| else: | |||
| usage(sys.argv[0]) | |||
| exit(1) | |||
| match(sys.argv[2], cv2.VideoCapture(capid)) | |||
| elif sys.argv[1] == "record": | |||
| if len(sys.argv) == 3: | |||
| capid = 2 | |||
| elif len(sys.argv) == 4: | |||
| capid = int(sys.argv[3]) | |||
| else: | |||
| usage(sys.argv[0]) | |||
| exit(1) | |||
| record(sys.argv[2], cv2.VideoCapture(capid)) | |||
| else: | |||
| usage(sys.argv[0]) | |||
| exit(1) | |||