From 060e622136231d6b69f463b24d4892d4c7369b44 Mon Sep 17 00:00:00 2001 From: Julien Lengrand-Lambert Date: Thu, 19 Jul 2012 18:04:17 +0200 Subject: [PATCH] Gets very starting point of a proper communication between my GUI and the Facemovie! --- bin/Ivolution.py | 2 +- facemovie/FacemovieThread.py | 81 +++++++++++++++++++++++++++++++++++- facemovie/Facemovie_lib.py | 14 +++---- gui/IvolutionWindow.py | 9 ++-- 4 files changed, 93 insertions(+), 13 deletions(-) diff --git a/bin/Ivolution.py b/bin/Ivolution.py index e4a7a86..8f696e8 100755 --- a/bin/Ivolution.py +++ b/bin/Ivolution.py @@ -8,6 +8,6 @@ from gi.repository import Gtk, GObject from gui import IvolutionWindow -my_app = IvolutionWindow.IvolutionWindow() +my_app = IvolutionWindow.IvolutionWindow("Ivolution") GObject.threads_init() Gtk.main() diff --git a/facemovie/FacemovieThread.py b/facemovie/FacemovieThread.py index 546b1d2..55b2032 100644 --- a/facemovie/FacemovieThread.py +++ b/facemovie/FacemovieThread.py @@ -14,7 +14,81 @@ import logging from facemovie import Facemovie_lib -class FacemovieThread(threading.Thread): +class Observer(): + """ + Implements a simple Observer from the Observer pattern + """ + + def __init__(self, name="bob"): + """ + """ + self.name = name + + + def update(self, message): + """ + """ + if message is not None: + print "%s received %s" %(self.name, message) + + def __str__(self): + return self.name + + +class Observable(): + """ + Implements a simple Observable from the Observer pattern + """ + + def __init__(self): + """ + """ + self.val = 1 + self.obs_collection = [] + + + def subscribe(self, observer): + """ + """ + try: + if not(observer in self.obs_collection): + self.obs_collection.append(observer) + print "%s added to collection" %(str(observer)) + else: + print "%s already in collection" %(str(observer)) + + except TypeError: + print "Failed to add %s" %(str(observer)) + + def unsubscribe(self, observer): + """ + """ + try: + if observer in self.obs_collection: + self.obs_collection.remove(observer) + print "%s removed from collection" %(str(observer)) + else: + print "%s not in collection" %(str(observer)) + + except TypeError: + print "Failed to remove %s" %(str(observer)) + + def notify(self, message): + """ + """ + for observer in self.obs_collection: + print "sent %s to %s" %(message, str(observer)) + observer.update(message) + + + def set_val(self, val=1): + """ + """ + self.val += val + self.notify(str(self.val)) + + +class FacemovieThread(threading.Thread, Observable): ''' Creates a Thread version of Facemovie using the facemovie_lib. This class can then be run anywhere, from a GUI, script, ... @@ -27,6 +101,8 @@ class FacemovieThread(threading.Thread): :param face_params: A faceparams object that contains all needed information to run the Facemovie. :type face_params: FaceParams """ + Observable.__init__(self) + threading.Thread.__init__(self) self.face_params = face_params @@ -35,6 +111,7 @@ class FacemovieThread(threading.Thread): def run(self): my_logger = logging.getLogger('FileLog') my_logger.debug("Thread started") + self.notify("Thread Started") self.facemovie.list_guys() my_logger.debug("Guys listed") @@ -45,4 +122,4 @@ class FacemovieThread(threading.Thread): self.facemovie.save_movie() my_logger.debug("Movie saved") - my_logger.debug("Thread terminated") + my_logger.debug("Thread terminated") \ No newline at end of file diff --git a/facemovie/Facemovie_lib.py b/facemovie/Facemovie_lib.py index 85e5dcf..9282475 100644 --- a/facemovie/Facemovie_lib.py +++ b/facemovie/Facemovie_lib.py @@ -101,7 +101,7 @@ class FaceMovie(object): # loading images, create Guys and store it into guys for root, _, files in os.walk(self.source): for a_file in files: - if run : # as long as we want to continue + if self.run : # as long as we want to continue guy_source = os.path.join(root, a_file) try: image = cv.LoadImage(guy_source) @@ -151,7 +151,7 @@ class FaceMovie(object): In case no face is found, a warning is returned and Guy is set to None """ for a_guy in self.guys: - if run: + if self.run: a_guy.search_face(self.face_params) if a_guy.has_face(): # face(s) have been found self.console_logger.info("Face found for %s" % (a_guy.name)) @@ -279,7 +279,7 @@ class FaceMovie(object): x_af = 0 y_af = 0 for a_guy in self.guys: - if run : + if self.run : (xc, yc) = a_guy.resized_center() (inx, iny) = a_guy.resized_dims() @@ -307,7 +307,7 @@ class FaceMovie(object): wl = 1000000 # space left left of eyes wr = 1000000 # space left right of eyes for a_guy in self.guys: - if run: + if self.run: (xc, yc) = a_guy.resized_center() (inx, iny) = a_guy.resized_dims() @@ -365,7 +365,7 @@ class FaceMovie(object): 1) ii = 0 for a_guy in self.guys: - if run: + if self.run: ii += 1 self.console_logger.info("Saving frame %d / %d" %(ii, self.number_guys()) ) self.my_logger.info("Saving frame %d / %d" %(ii, self.number_guys()) ) @@ -388,7 +388,7 @@ class FaceMovie(object): cv.ResizeWindow(win_name, 640, 480) for a_guy in self.guys: - if run: + if self.run: out_im = self.prepare_image(a_guy) cv.ShowImage(win_name, out_im) cv.WaitKey(mytime) @@ -406,7 +406,7 @@ class FaceMovie(object): :type im_format: string """ for a_guy in self.guys: - if run: + if self.run: out_im = self.prepare_image(a_guy) self.save_guy(out_im, a_guy.name, im_format) diff --git a/gui/IvolutionWindow.py b/gui/IvolutionWindow.py index 83405cd..a2afa30 100755 --- a/gui/IvolutionWindow.py +++ b/gui/IvolutionWindow.py @@ -12,13 +12,15 @@ from AboutDialog import AboutDialog import os parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -os.sys.path.insert(0,parentdir) +os.sys.path.insert(0,parentdir) # import parent folder + from facemovie import Facemovie_lib from facemovie import FaceParams from facemovie import FacemovieThread -class IvolutionWindow(): - def __init__(self): +class IvolutionWindow(FacemovieThread.Observer): + def __init__(self, name): + FacemovieThread.Observer.__init__(self, name) self.my_logger = None self.console_logger = None @@ -96,6 +98,7 @@ class IvolutionWindow(): self.print_parameters() # Instantiating the facemovie self.facemovie = FacemovieThread.FacemovieThread(self.face_params) + self.facemovie.subscribe(self) # I want new information ! self.facemovie.start() def on_stopbutton_pressed(self, widget):