Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. class MotionDetectorAdaptative():
  2. def onChange(self, val):
  3. self.threshold = val
  4.  
  5. def __init__(self, threshold=25, doRecord=True, showWindows=True):
  6.  
  7. self.writer = None
  8. self.font = None
  9. self.doRecord = doRecord
  10. self.show = showWindows
  11. self.frame = None
  12.  
  13.  
  14. self.capture = cv.CaptureFromCAM(0)
  15. self.frame = cv.QueryFrame(self.capture)
  16. if doRecord:
  17. self.Recorder()
  18.  
  19. self.gray_frame = cv.CreateImage(cv.GetSize(self.frame), cv.IPL_DEPTH_8U, 1)
  20. self.average_frame = cv.CreateImage(cv.GetSize(self.frame), cv.IPL_DEPTH_32F, 3)
  21. self.absdiff_frame = None
  22. self.previous_frame = None
  23.  
  24. self.surface = self.frame.width * self.frame.height
  25. self.currentsurface = 0
  26. self.currentcontours = None
  27. self.threshold = threshold
  28. self.isRecording = False
  29. self.trigger_time = 0
  30.  
  31. if showWindows:
  32. cv.NamedWindow("Image")
  33.  
  34. def Recorder(self): # Create the recorder
  35. codec = cv.CV_FOURCC('I', 'Y', 'U', 'V')
  36. filename = time.strftime("%m-%d-%H-%M-%S") + '.avi'
  37. ## self.writer = cv.CreateVideoWriter(datetime.now().strftime("%b-%d_%H_%M_%S") + ".avi", codec, 15,
  38. # cv.GetSize(self.frame), 1)
  39. self.writer = cv.CreateVideoWriter(filename, codec, 10.0, cv.GetSize(self.frame), 1)
  40.  
  41. self.font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 8) # Creates a font
  42.  
  43. def run(self):
  44. started = time.time()
  45. while True:
  46.  
  47. currentframe = cv.QueryFrame(self.capture)
  48. instant = time.time()
  49.  
  50. self.processImage(currentframe)
  51.  
  52. if not self.isRecording:
  53. if self.somethingHasMoved():
  54.  
  55.  
  56. self.trigger_time = instant
  57. if instant > started + 10:
  58. print "Something is moving !"
  59. time.sleep(0.4)
  60. ImageGrab.grab().save("pic.jpg", "JPEG")
  61. if self.doRecord:
  62. self.isRecording = True
  63.  
  64.  
  65. cv.DrawContours(currentframe, self.currentcontours, (0, 0, 255), (0, 255, 0), 1, 2, cv.CV_FILLED)
  66. else:
  67. if instant >= self.trigger_time + 10:
  68. ######The problem area
  69.  
  70. t = threading.Thread(target=mail2.send())
  71. t.start()
  72. print "Stop recording"
  73. self.isRecording = False
  74. else:
  75. cv.PutText(currentframe, datetime.now().strftime("%b %d, %H:%M:%S"), (25, 30), self.font,
  76. 0)
  77. cv.WriteFrame(self.writer, currentframe)
  78.  
  79. if self.show:
  80. cv.ShowImage("Image", currentframe)
  81.  
  82. c = cv.WaitKey(1) % 0x100
  83. if c == 27 or c == 10:
  84. break
  85.  
  86. def processImage(self, curframe):
  87.  
  88. cv.Smooth(curframe, curframe)
  89.  
  90. if not self.absdiff_frame:
  91. self.absdiff_frame = cv.CloneImage(curframe)
  92. self.previous_frame = cv.CloneImage(curframe)
  93. cv.Convert(curframe, self.average_frame)
  94. else:
  95. cv.RunningAvg(curframe, self.average_frame, 0.05)
  96.  
  97. cv.Convert(self.average_frame, self.previous_frame)
  98.  
  99. cv.AbsDiff(curframe, self.previous_frame, self.absdiff_frame)
  100.  
  101. cv.CvtColor(self.absdiff_frame, self.gray_frame, cv.CV_RGB2GRAY)
  102. cv.Threshold(self.gray_frame, self.gray_frame, 50, 255, cv.CV_THRESH_BINARY)
  103.  
  104. cv.Dilate(self.gray_frame, self.gray_frame, None, 15)
  105. cv.Erode(self.gray_frame, self.gray_frame, None, 10)
  106.  
  107. def somethingHasMoved(self):
  108.  
  109. storage = cv.CreateMemStorage(0)
  110. contours = cv.FindContours(self.gray_frame, storage, cv.CV_RETR_EXTERNAL, cv.CV_CHAIN_APPROX_SIMPLE)
  111.  
  112. self.currentcontours = contours
  113.  
  114. while contours:
  115. self.currentsurface += cv.ContourArea(contours)
  116. contours = contours.h_next()
  117.  
  118. avg = (self.currentsurface * 100) / self.surface
  119. self.currentsurface = 0
  120.  
  121. if avg > 8:
  122.  
  123. return True
  124. else:
  125. return False
  126.  
  127. failure_max = 3
  128. passwords = [('admin', 'admin'), ('new', 'help')]
  129.  
  130.  
  131. def make_entry(parent, caption, width=None, **options):
  132. tk.Label(parent, text=caption).pack(side=tk.TOP)
  133. entry = tk.Entry(parent, **options)
  134. if width:
  135. entry.config(width=width)
  136. entry.pack(side=tk.TOP, padx=10, fill=tk.BOTH)
  137. return entry
  138.  
  139.  
  140. def enter(event):
  141. check_password()
  142.  
  143.  
  144. def check_password(failures=[]):
  145. """ Collect 1's for every failure and quit program in case of failure_max failures """
  146. print(user.get(), password.get())
  147. if (user.get(), password.get()) in passwords:
  148. root.destroy()
  149. detect = MotionDetectorAdaptative(doRecord=True)
  150. detect.run()
  151. t = threading.Thread(target=mail2.send())
  152.  
  153. print('Logged in')
  154.  
  155. return
  156. failures.append(1)
  157. if sum(failures) >= failure_max:
  158. root.destroy()
  159.  
  160. raise SystemExit('Unauthorized login attempt')
  161. else:
  162. root.title('Try again. Attempt %i/%i' % (sum(failures) + 1, failure_max))
  163.  
  164.  
  165. root = tk.Tk()
  166. root.geometry('300x160')
  167. root.title('Enter your information')
  168. # frame for window margin
  169. parent = tk.Frame(root, padx=10, pady=10)
  170. parent.pack(fill=tk.BOTH, expand=True)
  171. # entrys with not shown text
  172. user = make_entry(parent, "User name:", 16, show='*')
  173. password = make_entry(parent, "Password:", 16, show="*")
  174. # button to attempt to login
  175. b = tk.Button(parent, borderwidth=4, text="Login", width=10, pady=8, command=check_password)
  176. b.pack(side=tk.BOTTOM)
  177. password.bind('<Return>', enter)
  178.  
  179. user.focus_set()
  180.  
  181. parent.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement