1
2
3
4 import gtk
5 import gobject
6 import threading
7 import time
8 from opencv.highgui import cvCreateFileCapture, cvQueryFrame, cvSaveImage
9 from opencv.cv import cvCloneImage, CV_GRAY2RGB
10
11 import create_sgf
12 from function import convert_opencv2gtk, convert_opencv_gray2gtk, load_image_no_webcam
13 from interface_configuration import Interface_configuration
14 from interface_about import Interface_about
15 from camera import Camera
16 from video import Video
17 from cte import WITH_VIDEO, WITH_WEBCAM, THRESHOLD
18 from intersection import Intersection
19 from difference import difference
20 from luminosity import search_circle
21
22 gtk.gdk.threads_init()
23
25 """Clase utilizada para las interfaz princpipal. """
27
28
29 self.values = []
30 self.capture = None
31 self.file_sgf = None
32 self.photos = []
33 self.count = 0
34 self.configuration_open = False
35
36
37 self.gladefile = "gui/main.glade"
38 self.glade = gtk.Builder()
39 self.glade.add_from_file(self.gladefile)
40
41
42 self.window = self.glade.get_object("window_main")
43 self.image_left = self.glade.get_object("main_image_left")
44 self.image_right = self.glade.get_object("main_image_right")
45 self.button_search = self.glade.get_object("button_search_intersection")
46 self.button_ok = self.glade.get_object("button_intersection_ok")
47 self.button_foto = self.glade.get_object("button_foto")
48 self.button_end = self.glade.get_object("button_end")
49 self.menu_file_new = self.glade.get_object("menu_file_new")
50 self.progressbar = self.glade.get_object("progressbar")
51
52
53 self.glade.connect_signals(self)
54
55
56 self.window.set_icon_from_file("images/icono.png")
57 self.window.set_title("Tablerogo")
58 self.button_foto.set_sensitive(False)
59 self.button_ok.set_sensitive(False)
60 self.button_search.set_sensitive(False)
61 self.button_end.set_sensitive(False)
62
63
64 self.window.show()
65
66
67 self.menu_file_new_activate(self.menu_file_new)
68
69
70
71 - def menu_file_new_activate(self, widget):
72 """Callback que es llamado cuando se pulsa el botón de Nuevo en la
73 barra de menú de la interfaz y que nos abre una nueva interfaz
74 de configuración. """
75
76
77 self.camera = Camera()
78
79 if not self.configuration_open:
80 self.i_configuration = Interface_configuration(self.camera)
81 self.configuration_open = True
82
83 self.checking = gobject.timeout_add(500, self.check_configuration)
84 else:
85 self.i_configuration.window.activate_default()
86
88 """Callback que es llamado cuando se pulsa el botón de Acerca de en la
89 barra de menú de la interfaz y que nos abre una nueva ventana. """
90 Interface_about()
91
93 """Callback que es llamado cuando se pulsa el botón del idioma 1 en la
94 barra de menú de la interfaz y que nos cambia al idioma seleccionado.
95 """
96 print "cambiado a lenguaje_1"
97
99 """Callback que es llamado cuando se pulsa el botón del idioma 2 en la
100 barra de menú de la interfaz y que nos cambia al idioma seleccionado.
101 """
102 print "cambiado a lenguaje_2"
103
104 - def menu_file_exit_activate(self, widget):
105 """Callback que es llamado cuando pulsamos la opción de salir de la
106 barra menú. """
107 gtk.main_quit()
108 exit()
109
110
112 """Callback que es llamado cuando pulsamos el botón terminar"""
113 self.end_file_sgf()
114
116 """Callback que es llamado para buscar las intersecciones del tablero
117 cuando pulsamos el boton Buscar Intersecciones. """
118
119 gobject.source_remove(self.refresh)
120 self.quit = False
121 self.new_thread(self.thread_progressbar)
122 self.new_thread(self.thread_search_intersection)
123 self.progressbar.show()
124
126 """Callback que es llamado cuando pulsamos el boton Intersecciones OK,
127 lo que hace es activar el foton de foto y el de terminar para que
128 empecemos a buscar piedras. """
129 self.button_foto.set_sensitive(True)
130 self.button_search.set_sensitive(False)
131 self.button_ok.set_sensitive(False)
132 self.button_end.set_sensitive(True)
133 self.image_right.hide()
134 widget.hide()
135 self.window.reshow_with_initial_size()
136
138 """Callback que es llamado cuando pulsamos el boton Foto, el cual nos
139 busca los cambios producidos en el tablero. """
140
141 save = cvCloneImage(self.frame)
142 self.photos.append(save)
143 ima_diff = difference(self.photos[self.count], self.photos[self.count-1])
144
145 try: cvSaveImage("images/%s.png" %self.count, ima_diff)
146 except: print "Error al guardar la diferencia "
147
148 stones = search_circle(ima_diff, self.intersection.tablero, \
149 self.intersection.size)
150 values = self.intersection.search_intersection(stones)
151 print "Valores: ", values
152
153
154 self.file_sgf.add_text(values[0], values[1])
155 if values[2]:
156 self.end_file_sgf()
157 self.count += 1
158
159
160 - def gtk_main_quit(self, widget):
161 """Funcion que es llamada cuando queremos cerramos la ventana. """
162 gtk.main_quit()
163 exit()
164
165
166
167 - def load_image_left(self, image):
168 """Nos carga una imagen en la parte izquierda de la pantalla.
169 @param image: imagen a cargar.
170 @type image: L{IplImage}"""
171 pix_buf = convert_opencv2gtk(image)
172 self.image_left.set_from_pixbuf(pix_buf)
173
174 - def load_image_right(self, image):
175 """Nos carga una imagen en la parte derecha de la pantalla.
176 @param image: imagen a cargar.
177 @type image: L{IplImage}"""
178 pix_buf = convert_opencv_gray2gtk(image)
179 self.image_right.set_from_pixbuf(pix_buf)
180
182 """Comprueba si la ventana de configuración está abierta.
183 @return: True si la configuración se ha creado correctamente,
184 False en caso contrario.
185 @rtype: C{bool}"""
186 if not self.i_configuration.open_window_configuration:
187 self.configuration_open = False
188 if self.i_configuration.configuration_ok:
189 self.configuration_applicate()
190 return False
191 return True
192
193 - def end_file_sgf(self):
194 """Función que cierra el archivo sgf y desactiva los botones hasta
195 nueva configuración. """
196 self.file_sgf.end_file()
197 self.button_foto.set_sensitive(False)
198 self.button_search.set_sensitive(False)
199 self.button_ok.set_sensitive(False)
200 self.button_end.set_sensitive(False)
201 self.image_left.hide()
202
203
204 gobject.source_remove(self.refresh)
205
206 self.configuration_initial()
207
208
209
211 """Funcion que vuelve a la configuración inicial. """
212 self.window.reshow_with_initial_size()
213 self.values = []
214 self.capture = None
215 self.file_sgf = None
216 self.photos = []
217 self.count = 0
218 self.configuration_open = False
219
220
222 """Función que aplica la configuración creada en la interfaz
223 configuracion."""
224
225 self.values = self.i_configuration.values
226 if WITH_VIDEO == len(self.values):
227
228 self.video = Video()
229 self.video.open_video(self.values[1])
230 frame = self.video.get_frame()
231 self.sel = WITH_VIDEO
232 elif WITH_WEBCAM == len(self.values):
233 frame = self.camera.get_frame()
234 self.sel = WITH_WEBCAM
235
236 self.load_image_left(frame)
237
238 self.file_sgf = create_sgf.Create_sgf(self.values[0])
239 self.refresh = gobject.timeout_add(50, self.update)
240 self.button_search.set_sensitive(True)
241 self.image_left.show()
242
243
245 """Función que actualiza el video, cámara o imagen.
246 @return: Devuelve True siempre.
247 @rtype: C{bool}
248 """
249 if WITH_VIDEO == self.sel:
250 self.frame = self.video.get_frame()
251 elif WITH_WEBCAM == self.sel:
252 self.frame = self.camera.get_frame()
253 self.load_image_left(self.frame)
254 return True
255
256
257 - def new_thread(self, method):
258 """Funcion que crea un nuevo hilo. """
259 t = threading.Thread(target=method, args=())
260 t.start()
261
262
264 """ Función hilo que muestra la barra de progreso. """
265 while not self.quit:
266 time.sleep(0.01)
267 gtk.gdk.threads_enter()
268 self.progressbar.pulse()
269 gtk.gdk.threads_leave()
270
271
273 """ Función hilo que busca las intersecciones del tablero. """
274
275 self.button_search.set_sensitive(False)
276 save = cvCloneImage(self.frame)
277 self.photos.append(save)
278 self.intersection = Intersection(self.photos[self.count])
279
280 if self.intersection.detect_intersections(THRESHOLD) != -1:
281
282 ima = self.intersection.media()
283 self.load_image_right(ima)
284 self.image_right.show()
285 self.button_ok.show()
286
287 self.button_ok.set_sensitive(True)
288
289 self.button_search.set_sensitive(True)
290 self.count += 1
291
292 self.quit = True
293 self.progressbar.hide()
294 self.refresh = gobject.timeout_add(50, self.update)
295