import cv2 import datetime import time import numpy as np from pygame import mixer import pickle import copy def alert(): mixer.init() alert = mixer.Sound('noises/beep-07.wav') for i in range(5): alert.play() time.sleep(0.1) alert.play() def click_event(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: if 620 <= y <= 703 and 20 <= x <= 169: print('cam') global cam_status if cam_status == 1: cam_status = 0 elif cam_status == 0: cam_status = 1 elif 620 <= y <= 703 and 189 <= x <= 448: print('doorbell') alert() elif 620 <= y <= 703 and 468 <= x <= 734: print('open gate') global wait_notification wait_notification = 1 elif 620 <= y <= 703 and 754 <= x <= 945: global name_of_photo print('taking photo... nr ' + str(name_of_photo)) if name_of_photo > 100: name_of_photo = 1 img_item = "photos/" + str(name_of_photo) + ".png" cv2.imwrite(img_item, frame) name_of_photo = name_of_photo + 1 elif 620 <= y <= 703 and 965 <= x <= 1173: print('pick up') elif 620 <= y <= 703 and 1193 <= x <= 1267: print('off') with open("variable.pickle", "wb") as f: pickle.dump(name_of_photo, f) cap.release() out.release() cv2.destroyAllWindows() exit() def click_event2(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: global displayString if 348 <= y <= 370 and 59 <= x <= 86: print("1 outdoor") displayString = displayString + '1' print(displayString) if 348 <= y <= 370 and 100 <= x <= 128: print("2 outdoor") displayString = displayString + '2' print(displayString) if 348 <= y <= 370 and 142 <= x <= 169: print("3 outdoor") displayString = displayString + '3' print(displayString) if 390 <= y <= 412 and 59 <= x <= 86: print("4 outdoor") displayString = displayString + '4' print(displayString) if 390 <= y <= 412 and 100 <= x <= 128: print("5 outdoor") displayString = displayString + '5' print(displayString) if 390 <= y <= 412 and 142 <= x <= 169: print("6 outdoor") displayString = displayString + '6' print(displayString) if 431 <= y <= 453 and 59 <= x <= 86: print("7 outdoor") displayString = displayString + '7' print(displayString) if 431 <= y <= 453 and 100 <= x <= 128: print("8 outdoor") displayString = displayString + '8' print(displayString) if 431 <= y <= 453 and 142 <= x <= 169: print("9 outdoor") displayString = displayString + '9' print(displayString) if 472 <= y <= 495 and 59 <= x <= 86: print("* outdoor") displayString = displayString + '*' print(displayString) print("0 outdoor") displayString = displayString + '0' print(displayString) if 472 <= y <= 495 and 142 <= x <= 169: print("# outdoor") displayString = displayString + '#' print(displayString) display_work(len(displayString)) def display_work(length): global displayString if length == 1: onestar = cv2.imread('images/*.png') outDoor[220:304, 54:214] = onestar elif length == 2: twostar = cv2.imread('images/**.png') outDoor[220:304, 54:214] = twostar elif length == 3: threestar = cv2.imread('images/***.png') outDoor[220:304, 54:214] = threestar elif length == 4: if displayString == "1234": goodpass = cv2.imread('images/goodpass.png') outDoor[220:304, 54:214] = goodpass if wait_seconds2(3) == True: displayString = displayString + '#' else: badpass = cv2.imread('images/badpass.png') outDoor[220:304, 54:214] = badpass elif length == 5: displayString = '' def notification(): not1 = cv2.imread('notification/not1.png') frame[50:50 + 139, 800:800 + 406] = not1 if wait_seconds3(3) == True: global wait_notification wait_notification = 0 def putOnDisplay(frame, fheight, sheight, fwidth, swidth, src): img = cv2.imread(src) frame[fheight: sheight, fwidth: swidth] = img def putTimeOnDisplay(frame): font = cv2.FONT_HERSHEY_SIMPLEX actual_time = str( datetime.datetime.now().strftime("%b %d %Y %H:%M:%S")) cv2.putText(frame, actual_time, (10, 50), font, 1, (0, 255, 255), 2, cv2.LINE_AA) def wait_3_sec(start): live_time = datetime.datetime.now() time_to_expire = datetime.timedelta(0, 3) if (live_time - start) < time_to_expire: live_time = datetime.datetime.now() else: return True def wait_seconds1(time): global temp1 if temp1 == None: temp1 = datetime.datetime.now() else: live_time = datetime.datetime.now() time_to_expire = datetime.timedelta(0, time) if (live_time - temp1) < time_to_expire: live_time = datetime.datetime.now() else: temp1 = None return True def wait_seconds2(time): global temp2 if temp2 == None: temp2 = datetime.datetime.now() else: live_time = datetime.datetime.now() time_to_expire = datetime.timedelta(0, time) if (live_time - temp2) < time_to_expire: live_time = datetime.datetime.now() else: temp2 = None return True def wait_seconds3(time): global temp3 if temp3 == None: temp3 = datetime.datetime.now() else: live_time = datetime.datetime.now() time_to_expire = datetime.timedelta(0, time) if (live_time - temp3) < time_to_expire: live_time = datetime.datetime.now() else: temp3 = None return True def most_frequent(List): return max(set(List), key=List.count) # Declaration global displayString, wait_notification, temp1, temp2, temp3, name_of_photo displayString = "" wait_notification = 0 temp1 = None temp2 = None temp3 = None name_of_photo = 1 global cam_status cam_status = 0 List = [] count = 0 with open("variable.pickle", "rb") as f: name_of_photo = pickle.load(f) print(name_of_photo) cap = cv2.VideoCapture(0) four_cc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('recordings/output.avi', four_cc, 10.0, (1280, 720)) cap.set(3, 1280) cap.set(4, 720) # 3 face_cascade = cv2.CascadeClassifier( 'cascades/data/haarcascade_frontalface_alt2.xml') recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read("trainner.yml") labels = {} with open("labels.pickle", "rb") as f: og_labels = pickle.load(f) labels = {v: k for k, v in og_labels.items()} ### ################################################################################ while True: if not cap.isOpened(): print("Camera error") break ret, frameprev = cap.read() if cam_status == 1: frame = copy.deepcopy(frameprev) if cam_status == 0: frame = copy.deepcopy(frameprev) putOnDisplay(frame, 0, 720, 0, 1280, "images/black.png") # 3 gray = cv2.cvtColor(frameprev, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale( gray, scaleFactor=1.5, minNeighbors=5) if len(List) < 11: for (x, y, w, h) in faces: # print(x, y, w, h) roi_gray = gray[y:y+h, x:x+w] # (ycord_start, ycord_end) roi_color = frameprev[y:y + h, x:x + w] id_, conf = recognizer.predict(roi_gray) if conf >= 1: # and conf <= 85: # print(id_) count = count + 1 print(str(count) + " " + labels[id_]) font = cv2.FONT_HERSHEY_SIMPLEX name = labels[id_] color = (255, 255, 255) cv2.putText(frame, name, (x, y), font, 1, color, 2, cv2.LINE_AA) cam_status = 1 img_item = "my-image.png" cv2.imwrite(img_item, roi_gray) color = (255, 0, 0) # BGR 0-255 stroke = 2 end_cord_x = x + w end_cord_y = y + h cv2.rectangle(frame, (x, y), (end_cord_x, end_cord_y), color, stroke) List.append(labels[id_]) if len(List) == 11: font = cv2.FONT_HERSHEY_SIMPLEX putOnDisplay(frame, 120, 255, 60, 430, "images/is_coming.png") cv2.putText(frame, most_frequent(List), (80, 170), font, 1, (0, 255, 255), 2, cv2.LINE_AA) cv2.putText(frame, "is coming!", (250, 225), font, 1, (0, 255, 255), 2, cv2.LINE_AA) if wait_seconds1(10) == True: List = [] ################### if ret: # home_screen = copy.deepcopy(frame) putTimeOnDisplay(frame) putTimeOnDisplay(frameprev) putOnDisplay(frame, 620, 720, 0, 1280, 'images/menu.png') putOnDisplay(frame, 640, 640 + 63, 20, 169, 'icons/icon1.png') putOnDisplay(frame, 640, 640 + 63, 189, 448, 'icons/icon2.png') putOnDisplay(frame, 640, 640 + 63, 468, 734, 'icons/icon3.png') putOnDisplay(frame, 640, 640 + 63, 754, 945, 'icons/icon4.png') putOnDisplay(frame, 640, 640 + 63, 965, 1173, 'icons/icon5.png') putOnDisplay(frame, 640, 640 + 63, 1193, 1267, 'icons/icon6.png') if wait_notification == 1: notification() cv2.imshow('frame', frame) outDoor = cv2.imread('images/outDoorPanel.png') display_work(len(displayString)) cv2.imshow('outDoor', outDoor) out.write(frameprev) cv2.setMouseCallback('frame', click_event) cv2.setMouseCallback('outDoor', click_event2) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break print("zapisuje " + str(name_of_photo)) with open("variable.pickle", "wb") as f: pickle.dump(name_of_photo, f) cap.release() out.release() cv2.destroyAllWindows()