Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2014
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.38 KB | None | 0 0
  1. import dbus
  2. import dbus.decorators
  3. import dbus.glib
  4. import cv2.cv as cv
  5. import time
  6.  
  7.  
  8. class MotionDetectorInstantaneous():
  9.  
  10.     def onChange(self, val): #callback when the user change the detection threshold
  11.         self.threshold = val
  12.  
  13.     def __init__(self, threshold=8, showWindows=True, callback=None):
  14.  
  15.         self.callback = callback
  16.         self.writer = None
  17.         self.font = None
  18.         self.show = showWindows #Either or not show the 2 windows
  19.         self.frame = None
  20.  
  21.         self.capture = cv.CaptureFromCAM(0)
  22.         self.frame = cv.QueryFrame(self.capture) #Take a frame to init recorder
  23.  
  24.         self.frame1gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Gray frame at t-1
  25.         cv.CvtColor(self.frame, self.frame1gray, cv.CV_RGB2GRAY)
  26.  
  27.         #Will hold the thresholded result
  28.         self.res = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U)
  29.  
  30.         self.frame2gray = cv.CreateMat(self.frame.height, self.frame.width, cv.CV_8U) #Gray frame at t
  31.  
  32.         self.width = self.frame.width
  33.         self.height = self.frame.height
  34.         self.nb_pixels = self.width * self.height
  35.         self.threshold = threshold
  36.         self.isRecording = False
  37.         self.trigger_time = 0 #Hold timestamp of the last detection
  38.  
  39.         if showWindows:
  40.             cv.NamedWindow("Image")
  41.             cv.CreateTrackbar("Detection treshold: ", "Image", self.threshold, 100, self.onChange)
  42.  
  43.     def run(self):
  44.         started = time.time()
  45.         while True:
  46.  
  47.             curframe = cv.QueryFrame(self.capture)
  48.             instant = time.time() #Get timestamp o the frame
  49.  
  50.             self.processImage(curframe) #Process the image
  51.  
  52.             if self.somethingHasMoved():
  53.                 if self.callback:
  54.                     self.callback()
  55.  
  56.             if self.show:
  57.                 cv.ShowImage("Image", curframe)
  58.                 #cv.ShowImage("Res", self.res)
  59.  
  60.             cv.Copy(self.frame2gray, self.frame1gray)
  61.             c=cv.WaitKey(1) % 0x100
  62.             if c == 27 or c == 10: #Break if user enters 'Esc'.
  63.                 break
  64.  
  65.     def processImage(self, frame):
  66.         cv.CvtColor(frame, self.frame2gray, cv.CV_RGB2GRAY)
  67.  
  68.         #Absdiff to get the difference between to the frames
  69.         cv.AbsDiff(self.frame1gray, self.frame2gray, self.res)
  70.  
  71.         #Remove the noise and do the threshold
  72.         cv.Smooth(self.res, self.res, cv.CV_BLUR, 5,5)
  73.         cv.MorphologyEx(self.res, self.res, None, None, cv.CV_MOP_OPEN)
  74.         cv.MorphologyEx(self.res, self.res, None, None, cv.CV_MOP_CLOSE)
  75.         cv.Threshold(self.res, self.res, 10, 255, cv.CV_THRESH_BINARY_INV)
  76.  
  77.     def somethingHasMoved(self):
  78.         nb=0 #Will hold the number of black pixels
  79.  
  80.         for x in range(self.height): #Iterate the hole image
  81.             for y in range(self.width):
  82.                 if self.res[x,y] == 0.0: #If the pixel is black keep it
  83.                     nb += 1
  84.         avg = (nb*100.0)/self.nb_pixels #Calculate the average of black pixel in the image
  85.  
  86.         if avg > self.threshold:#If over the ceiling trigger the alarm
  87.             return True
  88.         else:
  89.             return False
  90.  
  91. class RingWorkrave():
  92.  
  93.     def __init__(self):
  94.         self.verbose = True
  95.         self.motion_detector = MotionDetectorInstantaneous(callback=self.move)
  96.  
  97.         self.ignore = False
  98.  
  99.         self.init_dbus()
  100.  
  101.     def init_dbus(self):
  102.         bus = dbus.SessionBus()
  103.         obj = bus.get_object("org.workrave.Workrave", "/org/workrave/Workrave/Core")
  104.  
  105.         self.workrave = dbus.Interface(obj, "org.workrave.CoreInterface")
  106.  
  107.         self.workrave.connect_to_signal("MicrobreakChanged",
  108.                                         self.microbreak_signal, sender_keyword='sender')
  109.         self.workrave.connect_to_signal("RestbreakChanged",
  110.                                         self.restbreak_signal, sender_keyword='sender')
  111.         self.workrave.connect_to_signal("DailylimitChanged",
  112.                                         self.dailylimit_signal, sender_keyword='sender')
  113.  
  114.     def move(self):
  115.         if not self.ignore:
  116.             self.workrave.ReportActivity("facedetect", True)
  117.  
  118.     def microbreak_signal(self, progress, sender=None):
  119.         #print "mb %s" % str(progress)
  120.         self.break_signal("microbreak", progress)
  121.  
  122.     def restbreak_signal(self, progress, sender=None):
  123.         #print "rb %s" % str(progress)
  124.         self.break_signal("restbreak", progress)
  125.  
  126.     def dailylimit_signal(self, progress, sender=None):
  127.         self.break_signal("dailylimit", progress)
  128.  
  129.     def break_signal(self, breakid, progress, sender=None):
  130.         if progress != "none":
  131.             self.count_face = 0
  132.             self.count_noface = 0
  133.             self.ignore = True
  134.             self.workrave.ReportActivity("facedetect", False)
  135.         else:
  136.             self.ignore = False
  137.  
  138.         if self.verbose:
  139.             if progress == "prelude":
  140.                 print "Ignoring user presence: %s warning" % breakid
  141.             elif progress == "break":
  142.                 print "Ignoring user presence: %s started" % breakid
  143.             elif progress == "none":
  144.                 print "Resuming presence monitoring: Break %s idle" % breakid
  145.             else:
  146.                 print "Unknown progress for %s: %s" % (breakid, progress)
  147.  
  148. if __name__ == "__main__":
  149.     ring = RingWorkrave()
  150.     ring.motion_detector.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement