Exemplo n.º 1
0
 def test_immediate(self):
     gdb = Recognizer(db=[self.Tinvar, self.Ninvar])
     r = gdb.recognize([Ncandidate], max_gpf=0)
     self.assertEqual(r._match_ops, 4)
     self.assertEqual(r._completed, 2)
     self.assertEqual(r.progress, 1)
     self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 2
0
    def test_scheduling_limits(self):
        global best_score
        from kivy.clock import Clock
        gdb = Recognizer(db=[self.Ninvar])
        tpls = len(self.Ninvar.templates)

        best_score = 0
        gdb.db.append(self.Ninvar)
        r = gdb.recognize([Ncandidate], max_gpf=1)
        r.bind(on_complete=best_score_cb)
        self.assertEqual(r.progress, 0)
        Clock.tick()
        self.assertEqual(r.progress, 0.5)
        self.assertEqual(best_score, 0)
        Clock.tick()
        self.assertEqual(r.progress, 1)
        self.assertTrue(best_score > 0.94 and best_score < 0.95)

        best_score = 0
        gdb.db.append(self.Ninvar)
        r = gdb.recognize([Ncandidate], max_gpf=1)
        r.bind(on_complete=best_score_cb)
        self.assertEqual(r.progress, 0)
        Clock.tick()
        self.assertEqual(r.progress, 1 / 3.)

        Clock.tick()
        self.assertEqual(r.progress, 2 / 3.)
        self.assertEqual(best_score, 0)

        Clock.tick()
        self.assertEqual(r.progress, 1)
        self.assertTrue(best_score > 0.94 and best_score < 0.95)
Exemplo n.º 3
0
 def test_immediate(self):
     gdb = Recognizer(db=[self.Tinvar, self.Ninvar])
     r = gdb.recognize([Ncandidate], max_gpf=0)
     self.assertEqual(r._match_ops, 4)
     self.assertEqual(r._completed, 2)
     self.assertEqual(r.progress, 1)
     self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 4
0
 def __init__(self, parent, data, loglevel):
     self.strokes = [[]]
     self.time = time.time()
     self.gdb = Recognizer()
     self.logger = logging.getLogger('StrokeRecognition')
     self.logger.setLevel(loglevel)
     self.logger.addHandler(CH)
     self.logger.info('Creating Gestures Templates..')
     circle = [[Vector(int(10+10*cos(t)),
                                           int(10+10*sin(t)))
                                    for t in np.linspace(0,2*pi,8)]]
     self.gdb.add_gesture('Circle',circle, strokes_sensitive=True)
     #Horizontal or vertical lines give error
     self.gdb.add_gesture('Line', [[Vector(10,60),Vector(40,50)]],
                          strokes_sensitive=True, priority=50)
     self.gdb.add_gesture('Triangle', [[Vector(10,10),
                                        Vector(15,15),
                                       Vector(20,20),
                                        Vector(20,20),
                                         Vector(25,15),
                                       Vector(30,10),
                                        Vector(30,10),
                                         Vector(20,10),
                                       Vector(10,10)]],
                         strokes_sensitive=False,
                         orientation_sensitive=False,
                         permute=False)
     self.gdb.add_gesture('Rectangle', [[Vector(10,10),
                                         Vector(10,15),
                                        Vector(10,20),
                                         Vector(10,20),
                                          Vector(15,20),
                                        Vector(20,20),
                                         Vector(20,20),
                                          Vector(20,15),
                                          Vector(20,10),
                                        Vector(20,10),
                                         Vector(15,10),
                                        Vector(10,10)]],
                         strokes_sensitive=False,
                          orientation_sensitive=False,
                         permute=False)
     self.logger.info('Templates created')
     self.found_gesture = False
     self.gesture = None
     self._data = data
     self._parent = parent
     self.ran = False
     self.gdb.bind(on_search_complete=self.search_stop)
     self.dist_thres = 0
     self.time_thres = 2
     self.skel_sub = mfilters.Subscriber(
         "skeleton", Image)
     self.clas_sub = mfilters.Subscriber(
         "class", TimeReference)
     self.image_ts = mfilters.TimeSynchronizer(
         [self.skel_sub, self.clas_sub], 30)
     self.image_ts.registerCallback(
         self.callback)
     self.bridge = CvBridge()
Exemplo n.º 5
0
    def test_scheduling_limits(self):
        global best_score
        from kivy.clock import Clock
        gdb = Recognizer(db=[self.Ninvar])
        tpls = len(self.Ninvar.templates)

        best_score = 0
        gdb.db.append(self.Ninvar)
        r = gdb.recognize([Ncandidate], max_gpf=1)
        r.bind(on_complete=best_score_cb)
        self.assertEqual(r.progress, 0)
        Clock.tick()
        self.assertEqual(r.progress, 0.5)
        self.assertEqual(best_score, 0)
        Clock.tick()
        self.assertEqual(r.progress, 1)
        self.assertTrue(best_score > 0.94 and best_score < 0.95)

        best_score = 0
        gdb.db.append(self.Ninvar)
        r = gdb.recognize([Ncandidate], max_gpf=1)
        r.bind(on_complete=best_score_cb)
        self.assertEqual(r.progress, 0)
        Clock.tick()
        self.assertEqual(r.progress, 1 / 3.)

        Clock.tick()
        self.assertEqual(r.progress, 2 / 3.)
        self.assertEqual(best_score, 0)

        Clock.tick()
        self.assertEqual(r.progress, 1)
        self.assertTrue(best_score > 0.94 and best_score < 0.95)
Exemplo n.º 6
0
    def test_transfer(self):
        gdb1 = Recognizer(db=[self.Ninvar])
        gdb2 = Recognizer()
        gdb1.transfer_gesture(gdb2, name='N')

        r = gdb2.recognize([Ncandidate], max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 7
0
 def save_selection_to_file(self, filename, *l):
     if not self.selected_count:
         self.recognizer.export_gesture(filename=filename)
     else:
         tmpgdb = Recognizer()
         for i in self.ids.gesture_list.children:
             if i.ids.select.state == 'down':
                 for g in i.gesture_list:
                     tmpgdb.db.append(g)
         tmpgdb.export_gesture(filename=filename)
Exemplo n.º 8
0
 def save_selection_to_file(self, filename, *l):
     if not self.selected_count:
         self.recognizer.export_gesture(filename=filename)
     else:
         tmpgdb = Recognizer()
         for i in self.ids.gesture_list.children:
             if i.ids.select.state == 'down':
                 for g in i.gesture_list:
                     tmpgdb.db.append(g)
         tmpgdb.export_gesture(filename=filename)
Exemplo n.º 9
0
    def test_protractor_bound(self):
        gdb = Recognizer(db=[self.Tbound, self.Nbound])
        r = gdb.recognize([NGesture], orientation_sensitive=True, max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] >= 0.99)

        r = gdb.recognize([NGesture], orientation_sensitive=False, max_gpf=0)
        self.assertEqual(r.best['name'], None)
        self.assertEqual(r.best['score'], 0)

        r = gdb.recognize([Ncandidate], orientation_sensitive=True, max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 10
0
    def test_timeout_case_1(self):
        global best_score
        from kivy.clock import Clock
        from time import sleep

        best_score = 0
        gdb = Recognizer(db=[self.Tbound, self.Ninvar])
        r = gdb.recognize([Ncandidate], max_gpf=1, timeout=0.4)
        Clock.tick()  # matches Tbound in this tick
        self.assertEqual(best_score, 0)
        sleep(0.4)
        Clock.tick()  # should match Ninv, but times out (got T)
        self.assertEqual(r.status, 'timeout')
        self.assertEqual(r.progress, .5)
        self.assertTrue(r.best['name'] == 'T')
        self.assertTrue(r.best['score'] < 0.5)
Exemplo n.º 11
0
    def test_protractor_bound(self):
        gdb = Recognizer(db=[self.Tbound, self.Nbound])
        r = gdb.recognize([NGesture], orientation_sensitive=True,
            max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] >= 0.99)

        r = gdb.recognize([NGesture], orientation_sensitive=False,
            max_gpf=0)
        self.assertEqual(r.best['name'], None)
        self.assertEqual(r.best['score'], 0)

        r = gdb.recognize([Ncandidate], orientation_sensitive=True,
            max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 12
0
    def test_timeout_case_1(self):
        global best_score
        from kivy.clock import Clock
        from time import sleep

        best_score = 0
        gdb = Recognizer(db=[self.Tbound, self.Ninvar])
        r = gdb.recognize([Ncandidate], max_gpf=1, timeout=0.4)
        Clock.tick()  # matches Tbound in this tick
        self.assertEqual(best_score, 0)
        sleep(0.4)
        Clock.tick()  # should match Ninv, but times out (got T)
        self.assertEqual(r.status, 'timeout')
        self.assertEqual(r.progress, .5)
        self.assertTrue(r.best['name'] == 'T')
        self.assertTrue(r.best['score'] < 0.5)
Exemplo n.º 13
0
    def test_scheduling(self):
        global best_score
        from kivy.clock import Clock
        gdb = Recognizer(db=[self.Tinvar, self.Ninvar])
        r = gdb.recognize([Ncandidate], max_gpf=1)
        r.bind(on_complete=best_score_cb)

        # _recognize_tick is scheduled here; compares to Tinvar
        Clock.tick()
        self.assertEqual(r.progress, .5)
        self.assertEqual(best_score, .0)

        # Now complete the search operation
        Clock.tick()
        self.assertEqual(r.progress, 1)
        self.assertTrue(best_score > 0.94 and best_score < 0.95)
Exemplo n.º 14
0
    def test_scheduling(self):
        global best_score
        from kivy.clock import Clock
        gdb = Recognizer(db=[self.Tinvar, self.Ninvar])
        r = gdb.recognize([Ncandidate], max_gpf=1)
        r.bind(on_complete=best_score_cb)

        # _recognize_tick is scheduled here; compares to Tinvar
        Clock.tick()
        self.assertEqual(r.progress, .5)
        self.assertEqual(best_score, .0)

        # Now complete the search operation
        Clock.tick()
        self.assertEqual(r.progress, 1)
        self.assertTrue(best_score > 0.94 and best_score < 0.95)
Exemplo n.º 15
0
    def build(self):
        self.manager = ScreenManager(transition=SlideTransition(duration=.15))
        self.recognizer = Recognizer()
        self.recognizer.import_gesture(filename='../res/calc_symbols.kg')
        self.calc_bar = CalcBar()

        # Gesture screen
        surface = GestureSurface(line_width=2,
                                 draw_bbox=True,
                                 use_random_color=True)
        surface_screen = Screen(name='surface')
        surface_screen.add_widget(surface)
        self.manager.add_widget(surface_screen)

        surface.bind(on_gesture_discard=self.handle_gesture_discard)
        surface.bind(on_gesture_complete=self.handle_gesture_complete)
        surface.bind(on_gesture_cleanup=self.handle_gesture_cleanup)
        self.surface = surface

        # NumPad screen
        numpad = Numpad(self.calc_bar)
        numpad_screen = Screen(name='numpad')
        numpad_screen.add_widget(numpad)
        self.manager.add_widget(numpad_screen)

        # Settings screen
        app_settings = CalculatorAppSettings()
        ids = app_settings.ids

        ids.max_strokes.bind(value=surface.setter('max_strokes'))
        ids.temporal_win.bind(value=surface.setter('temporal_window'))
        ids.timeout.bind(value=surface.setter('draw_timeout'))
        ids.line_width.bind(value=surface.setter('line_width'))
        ids.draw_bbox.bind(value=surface.setter('draw_bbox'))
        ids.use_random_color.bind(value=surface.setter('use_random_color'))

        settings_screen = Screen(name='settings')
        settings_screen.add_widget(app_settings)
        self.manager.add_widget(settings_screen)

        # Wrap in a gridlayout so the main menu is always visible
        layout = GridLayout(cols=1)
        layout.add_widget(self.calc_bar)
        layout.add_widget(MainMenu())
        layout.add_widget(self.manager)
        return layout
Exemplo n.º 16
0
    def test_export_import_case_1(self):
        gdb1 = Recognizer(db=[self.Ninvar])
        gdb2 = Recognizer()

        g = gdb1.export_gesture(name='N')
        gdb2.import_gesture(g)

        r = gdb2.recognize([Ncandidate], max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 17
0
    def test_timeout_case_2(self):
        global best_score
        from kivy.clock import Clock
        from time import sleep

        best_score = 0
        gdb = Recognizer(db=[self.Tbound, self.Ninvar, self.Tinvar])
        r = gdb.recognize([Ncandidate], max_gpf=1, timeout=0.8)

        Clock.tick()  # matches Tbound in this tick
        self.assertEqual(best_score, 0)
        sleep(0.4)
        Clock.tick()  # matches Ninvar in this tick
        sleep(0.4)
        Clock.tick()  # should match Tinvar, but times out
        self.assertEqual(r.status, 'timeout')
        self.assertEqual(r.progress, 2 / 3.)
        self.assertTrue(r.best['score'] >= .94 and r.best['score'] <= .95)
Exemplo n.º 18
0
    def test_timeout_case_2(self):
        global best_score
        from kivy.clock import Clock
        from time import sleep

        best_score = 0
        gdb = Recognizer(db=[self.Tbound, self.Ninvar, self.Tinvar])
        r = gdb.recognize([Ncandidate], max_gpf=1, timeout=0.8)

        Clock.tick()  # matches Tbound in this tick
        self.assertEqual(best_score, 0)
        sleep(0.4)
        Clock.tick()  # matches Ninvar in this tick
        sleep(0.4)
        Clock.tick()  # should match Tinvar, but times out
        self.assertEqual(r.status, 'timeout')
        self.assertEqual(r.progress, 2 / 3.)
        self.assertTrue(r.best['score'] >= .94 and r.best['score'] <= .95)
Exemplo n.º 19
0
    def test_transfer(self):
        gdb1 = Recognizer(db=[self.Ninvar])
        gdb2 = Recognizer()
        gdb1.transfer_gesture(gdb2, name='N')

        r = gdb2.recognize([Ncandidate], max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 20
0
    def test_priority_sorting(self):
        gdb = Recognizer()
        gdb.add_gesture('N', [NGesture], priority=10)
        gdb.add_gesture('T', [TGesture], priority=5)

        r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0,
                        force_priority_sort=True)
        self.assertEqual(r.best['name'], 'T')

        r = gdb.recognize([Ncandidate], goodscore=0.01,
                        force_priority_sort=False, max_gpf=0)
        self.assertEqual(r.best['name'], 'N')

        r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0,
                        priority=10)
        self.assertEqual(r.best['name'], 'T')

        r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0,
                        priority=4)
        self.assertEqual(r.best['name'], None)
Exemplo n.º 21
0
    def build(self):
        # Setting NoTransition breaks the "history" screen! Possibly related
        # to some inexplicable rendering bugs on my particular system
        self.manager = ScreenManager(transition=SlideTransition(
                                     duration=.15))
        self.recognizer = Recognizer()

        # Setup the GestureSurface and bindings to our Recognizer
        surface = GestureSurface(line_width=2, draw_bbox=True,
                                 use_random_color=True)
        surface_screen = Screen(name='surface')
        surface_screen.add_widget(surface)
        self.manager.add_widget(surface_screen)

        surface.bind(on_gesture_discard=self.handle_gesture_discard)
        surface.bind(on_gesture_complete=self.handle_gesture_complete)
        surface.bind(on_gesture_cleanup=self.handle_gesture_cleanup)
        self.surface = surface

        # History is the list of gestures drawn on the surface
        history = GestureHistoryManager()
        history_screen = Screen(name='history')
        history_screen.add_widget(history)
        self.history = history
        self.manager.add_widget(history_screen)

        # Database is the list of gesture templates in Recognizer
        database = GestureDatabase(recognizer=self.recognizer)
        database_screen = Screen(name='database')
        database_screen.add_widget(database)
        self.database = database
        self.manager.add_widget(database_screen)

        # Settings screen
        app_settings = MultistrokeAppSettings()
        ids = app_settings.ids

        ids.max_strokes.bind(value=surface.setter('max_strokes'))
        ids.temporal_win.bind(value=surface.setter('temporal_window'))
        ids.timeout.bind(value=surface.setter('draw_timeout'))
        ids.line_width.bind(value=surface.setter('line_width'))
        ids.draw_bbox.bind(value=surface.setter('draw_bbox'))
        ids.use_random_color.bind(value=surface.setter('use_random_color'))

        settings_screen = Screen(name='settings')
        settings_screen.add_widget(app_settings)
        self.manager.add_widget(settings_screen)

        # Wrap in a gridlayout so the main menu is always visible
        layout = GridLayout(cols=1)
        layout.add_widget(self.manager)
        layout.add_widget(MainMenu())
        return layout
Exemplo n.º 22
0
    def test_numstrokes_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(numstrokes=2)
        self.assertEqual(len(n), 0)

        gdb.add_gesture('T', [TGesture, TGesture])
        n = gdb.filter(numstrokes=2)
        self.assertEqual(len(n), 1)
        n = gdb.filter(numstrokes=[1, 2])
        self.assertEqual(len(n), 3)
Exemplo n.º 23
0
    def test_numpoints_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(numpoints=100)
        self.assertEqual(len(n), 0)

        gdb.add_gesture('T', [TGesture], numpoints=100)
        n = gdb.filter(numpoints=100)
        self.assertEqual(len(n), 1)
        n = gdb.filter(numpoints=[100, 16])
        self.assertEqual(len(n), 3)
Exemplo n.º 24
0
    def test_orientation_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(orientation_sensitive=True)
        self.assertEqual(len(n), 1)
        n = gdb.filter(orientation_sensitive=False)
        self.assertEqual(len(n), 1)
        n = gdb.filter(orientation_sensitive=None)
        self.assertEqual(len(n), 2)

        gdb.db.append(self.Tinvar)
        n = gdb.filter(orientation_sensitive=True)
        self.assertEqual(len(n), 1)
        n = gdb.filter(orientation_sensitive=False)
        self.assertEqual(len(n), 2)
        n = gdb.filter(orientation_sensitive=None)
        self.assertEqual(len(n), 3)
Exemplo n.º 25
0
    def test_parallel_recognize(self):
        global counter
        from kivy.clock import Clock

        counter = 0
        gdb = Recognizer()
        for i in range(9):
            gdb.add_gesture('T', [TGesture], priority=50)
        gdb.add_gesture('N', [NGesture])

        r1 = gdb.recognize([Ncandidate], max_gpf=1)
        r1.bind(on_complete=counter_cb)
        Clock.tick()  # first run scheduled here; 9 left

        r2 = gdb.recognize([Ncandidate], max_gpf=1)
        r2.bind(on_complete=counter_cb)
        Clock.tick()  # 8 left

        r3 = gdb.recognize([Ncandidate], max_gpf=1)
        r3.bind(on_complete=counter_cb)
        Clock.tick()  # 7 left

        # run some immediate searches, should not interfere.
        for i in range(5):
            n = gdb.recognize([TGesture], max_gpf=0)
            self.assertEqual(n.best['name'], 'T')
            self.assertTrue(round(n.best['score'], 1) == 1.0)

        for i in range(6):
            Clock.tick()
        self.assertEqual(counter, 0)
        Clock.tick()
        self.assertEqual(counter, 1)
        Clock.tick()
        self.assertEqual(counter, 2)
        Clock.tick()
        self.assertEqual(counter, 3)
Exemplo n.º 26
0
    def test_priority_sorting(self):
        gdb = Recognizer()
        gdb.add_gesture('N', [NGesture], priority=10)
        gdb.add_gesture('T', [TGesture], priority=5)

        r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0,
                        force_priority_sort=True)
        self.assertEqual(r.best['name'], 'T')

        r = gdb.recognize([Ncandidate], goodscore=0.01,
                        force_priority_sort=False, max_gpf=0)
        self.assertEqual(r.best['name'], 'N')

        r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0,
                        priority=10)
        self.assertEqual(r.best['name'], 'T')

        r = gdb.recognize([Ncandidate], goodscore=0.01, max_gpf=0,
                        priority=4)
        self.assertEqual(r.best['name'], None)
Exemplo n.º 27
0
    def test_export_import_case_2(self):
        from tempfile import mkstemp
        import os
        gdb1 = Recognizer(db=[self.Ninvar, self.Tinvar])
        gdb2 = Recognizer()
        fh, fn = mkstemp()
        os.close(fh)
        g = gdb1.export_gesture(name='N', filename=fn)

        gdb2.import_gesture(filename=fn)
        os.unlink(fn)

        self.assertEqual(len(gdb1.db), 2)
        self.assertEqual(len(gdb2.db), 1)
        r = gdb2.recognize([Ncandidate], max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 28
0
    def test_numpoints_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(numpoints=100)
        self.assertEqual(len(n), 0)

        gdb.add_gesture('T', [TGesture], numpoints=100)
        n = gdb.filter(numpoints=100)
        self.assertEqual(len(n), 1)
        n = gdb.filter(numpoints=[100, 16])
        self.assertEqual(len(n), 3)
Exemplo n.º 29
0
    def test_export_import_case_1(self):
        gdb1 = Recognizer(db=[self.Ninvar])
        gdb2 = Recognizer()

        g = gdb1.export_gesture(name='N')
        gdb2.import_gesture(g)

        r = gdb2.recognize([Ncandidate], max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 30
0
    def test_numstrokes_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(numstrokes=2)
        self.assertEqual(len(n), 0)

        gdb.add_gesture('T', [TGesture, TGesture])
        n = gdb.filter(numstrokes=2)
        self.assertEqual(len(n), 1)
        n = gdb.filter(numstrokes=[1, 2])
        self.assertEqual(len(n), 3)
Exemplo n.º 31
0
    def test_orientation_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(orientation_sensitive=True)
        self.assertEqual(len(n), 1)
        n = gdb.filter(orientation_sensitive=False)
        self.assertEqual(len(n), 1)
        n = gdb.filter(orientation_sensitive=None)
        self.assertEqual(len(n), 2)

        gdb.db.append(self.Tinvar)
        n = gdb.filter(orientation_sensitive=True)
        self.assertEqual(len(n), 1)
        n = gdb.filter(orientation_sensitive=False)
        self.assertEqual(len(n), 2)
        n = gdb.filter(orientation_sensitive=None)
        self.assertEqual(len(n), 3)
Exemplo n.º 32
0
    def test_parallel_recognize(self):
        global counter
        from kivy.clock import Clock

        counter = 0
        gdb = Recognizer()
        for i in range(9):
            gdb.add_gesture('T', [TGesture], priority=50)
        gdb.add_gesture('N', [NGesture])

        r1 = gdb.recognize([Ncandidate], max_gpf=1)
        r1.bind(on_complete=counter_cb)
        Clock.tick()  # first run scheduled here; 9 left

        r2 = gdb.recognize([Ncandidate], max_gpf=1)
        r2.bind(on_complete=counter_cb)
        Clock.tick()  # 8 left

        r3 = gdb.recognize([Ncandidate], max_gpf=1)
        r3.bind(on_complete=counter_cb)
        Clock.tick()  # 7 left

        # run some immediate searches, should not interfere.
        for i in range(5):
            n = gdb.recognize([TGesture], max_gpf=0)
            self.assertEqual(n.best['name'], 'T')
            self.assertTrue(round(n.best['score'], 1) == 1.0)

        for i in range(6):
            Clock.tick()
        self.assertEqual(counter, 0)
        Clock.tick()
        self.assertEqual(counter, 1)
        Clock.tick()
        self.assertEqual(counter, 2)
        Clock.tick()
        self.assertEqual(counter, 3)
Exemplo n.º 33
0
    def test_export_import_case_2(self):
        from tempfile import mkstemp
        import os
        gdb1 = Recognizer(db=[self.Ninvar, self.Tinvar])
        gdb2 = Recognizer()
        fh, fn = mkstemp()
        os.close(fh)
        g = gdb1.export_gesture(name='N', filename=fn)

        gdb2.import_gesture(filename=fn)
        os.unlink(fn)

        self.assertEqual(len(gdb1.db), 2)
        self.assertEqual(len(gdb2.db), 1)
        r = gdb2.recognize([Ncandidate], max_gpf=0)
        self.assertEqual(r.best['name'], 'N')
        self.assertTrue(r.best['score'] > 0.94 and r.best['score'] < 0.95)
Exemplo n.º 34
0
 def test_name_filter(self):
     gdb = Recognizer(db=[self.Ninvar, self.Nbound])
     n = gdb.filter()
     self.assertEqual(len(n), 2)
     n = gdb.filter(name='X')
     self.assertEqual(len(n), 0)
Exemplo n.º 35
0
class StrokeRecognition(object):
    def __init__(self, parent, data, loglevel):
        self.strokes = [[]]
        self.time = time.time()
        self.gdb = Recognizer()
        self.logger = logging.getLogger('StrokeRecognition')
        self.logger.setLevel(loglevel)
        self.logger.addHandler(CH)
        self.logger.info('Creating Gestures Templates..')
        circle = [[Vector(int(10+10*cos(t)),
                                              int(10+10*sin(t)))
                                       for t in np.linspace(0,2*pi,8)]]
        self.gdb.add_gesture('Circle',circle, strokes_sensitive=True)
        #Horizontal or vertical lines give error
        self.gdb.add_gesture('Line', [[Vector(10,60),Vector(40,50)]],
                             strokes_sensitive=True, priority=50)
        self.gdb.add_gesture('Triangle', [[Vector(10,10),
                                           Vector(15,15),
                                          Vector(20,20),
                                           Vector(20,20),
                                            Vector(25,15),
                                          Vector(30,10),
                                           Vector(30,10),
                                            Vector(20,10),
                                          Vector(10,10)]],
                            strokes_sensitive=False,
                            orientation_sensitive=False,
                            permute=False)
        self.gdb.add_gesture('Rectangle', [[Vector(10,10),
                                            Vector(10,15),
                                           Vector(10,20),
                                            Vector(10,20),
                                             Vector(15,20),
                                           Vector(20,20),
                                            Vector(20,20),
                                             Vector(20,15),
                                             Vector(20,10),
                                           Vector(20,10),
                                            Vector(15,10),
                                           Vector(10,10)]],
                            strokes_sensitive=False,
                             orientation_sensitive=False,
                            permute=False)
        self.logger.info('Templates created')
        self.found_gesture = False
        self.gesture = None
        self._data = data
        self._parent = parent
        self.ran = False
        self.gdb.bind(on_search_complete=self.search_stop)
        self.dist_thres = 0
        self.time_thres = 2
        self.skel_sub = mfilters.Subscriber(
            "skeleton", Image)
        self.clas_sub = mfilters.Subscriber(
            "class", TimeReference)
        self.image_ts = mfilters.TimeSynchronizer(
            [self.skel_sub, self.clas_sub], 30)
        self.image_ts.registerCallback(
            self.callback)
        self.bridge = CvBridge()
    def callback(self, skel, class_name):
        if self._parent.initialized and not self._parent.write_mode:
            try:
                skel = self.bridge.imgmsg_to_cv2(skel,
                                                 desired_encoding=
                                                 'passthrough')
                action = class_name.source
                if action == 'Index':
                    self.ran = False
                    self.add_stroke_vector(skel[-1, -1, 1],
                                           skel[-1, -1, 0])
                    self.time = time.time()
                elif action == 'Palm':
                    self.add_stroke()
                if not self.ran and time.time() - self.time > self.time_thres:
                    self.ran = True
                    if len(self.strokes[0])>0:
                        self.progress = self.gdb.recognize(self.strokes[:-1])
                    #removing last empty sublist          ^
                    clock.tick()
                    self._data.add(gesture=self.gesture,
                                   found_gesture=self.found_gesture,
                                   strokes=self.strokes)
                    self.strokes = [[]]
                    evt = CreateEvent(EVT_STRK_TYPE, -1)
                    wx.PostEvent(self._parent, evt)
            except Exception as e:
                 exc_type, exc_value, exc_traceback = sys.exc_info()
                 traceback.print_exception(exc_type,
                                    exc_value,
                                    exc_traceback, limit=2, file=sys.stdout)
                 print e
        else:
            self.strokes = [[]]


    def search_stop(self, gdb, pt):
        best = pt.best
        dist = best['dist']
        self.gesture = best['name']
        if dist > self.dist_thres and self.gesture is not None:
            self.found_gesture = True
            self.logger.debug('Gesture found as ' + str(self.gesture) +
                              ' having cos distance ' + str(dist))
        else:
            self.found_gesture = False
            self.logger.debug('Gesture not found. \n\tBest candidate was '+
                              str(self.gesture) +' with cos distance:' + str(dist))
        self.logger.debug('\tThe number of strokes was ' +
                          str(len(self.strokes)-1))
        self.logger.debug('\tStrokes:')
        for stroke in self.strokes[:-1]:
            self.logger.debug('\t\t'+str(stroke))
    def add_stroke(self):
        if len(self.strokes[-1])>0: #add stroke only if last stroke is not empty
            self.strokes.append([])
    def add_stroke_vector(self, xpoint, ypoint):
        if len(self.strokes[-1])>0:
            dist_check = norm(np.diff([np.array(self.strokes[-1][-1]),
                                       np.array([xpoint,ypoint])],axis=0))<10
        else:
            dist_check = True
        if dist_check:
            self.strokes[-1].append(Vector(xpoint,ypoint))
Exemplo n.º 36
0
class CalculatorApp(App):
    def handle_gesture_cleanup(self, surface, g, *l):
        if hasattr(g, '_result_label'):
            surface.remove_widget(g._result_label)

    def handle_gesture_discard(self, surface, g, *l):
        if surface.draw_timeout == 0:
            return

        text = '[b]Discarded:[/b] Not enough input'
        g._result_label = Label(text=text,
                                markup=True,
                                size_hint=(None, None),
                                center=(g.bbox['minx'], g.bbox['miny']))
        self.surface.add_widget(g._result_label)

    def handle_gesture_complete(self, surface, g, *l):
        result = self.recognizer.recognize(g.get_vectors())
        result._gesture_obj = g
        result.bind(on_complete=self.handle_recognize_complete)

    def handle_recognize_complete(self, result, *l):
        if self.surface.draw_timeout == 0:
            return

        best = result.best
        if best['name'] is None:
            text = '[b]No match[/b]'
        else:
            text = 'Name: [b]%s[/b]\nScore: [b]%f[/b]\nDistance: [b]%f[/b]' % (
                best['name'], best['score'], best['dist'])
            self.calc_bar.update_display(best['name'])

        g = result._gesture_obj
        g._result_label = Label(text=text,
                                markup=True,
                                size_hint=(None, None),
                                center=(g.bbox['minx'], g.bbox['miny']))
        self.surface.add_widget(g._result_label)

    def build(self):
        self.manager = ScreenManager(transition=SlideTransition(duration=.15))
        self.recognizer = Recognizer()
        self.recognizer.import_gesture(filename='../res/calc_symbols.kg')
        self.calc_bar = CalcBar()

        # Gesture screen
        surface = GestureSurface(line_width=2,
                                 draw_bbox=True,
                                 use_random_color=True)
        surface_screen = Screen(name='surface')
        surface_screen.add_widget(surface)
        self.manager.add_widget(surface_screen)

        surface.bind(on_gesture_discard=self.handle_gesture_discard)
        surface.bind(on_gesture_complete=self.handle_gesture_complete)
        surface.bind(on_gesture_cleanup=self.handle_gesture_cleanup)
        self.surface = surface

        # NumPad screen
        numpad = Numpad(self.calc_bar)
        numpad_screen = Screen(name='numpad')
        numpad_screen.add_widget(numpad)
        self.manager.add_widget(numpad_screen)

        # Settings screen
        app_settings = CalculatorAppSettings()
        ids = app_settings.ids

        ids.max_strokes.bind(value=surface.setter('max_strokes'))
        ids.temporal_win.bind(value=surface.setter('temporal_window'))
        ids.timeout.bind(value=surface.setter('draw_timeout'))
        ids.line_width.bind(value=surface.setter('line_width'))
        ids.draw_bbox.bind(value=surface.setter('draw_bbox'))
        ids.use_random_color.bind(value=surface.setter('use_random_color'))

        settings_screen = Screen(name='settings')
        settings_screen.add_widget(app_settings)
        self.manager.add_widget(settings_screen)

        # Wrap in a gridlayout so the main menu is always visible
        layout = GridLayout(cols=1)
        layout.add_widget(self.calc_bar)
        layout.add_widget(MainMenu())
        layout.add_widget(self.manager)
        return layout
Exemplo n.º 37
0
    def test_priority_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(priority=50)
        self.assertEqual(len(n), 0)

        gdb.add_gesture('T', [TGesture], priority=51)
        n = gdb.filter(priority=50)
        self.assertEqual(len(n), 0)
        n = gdb.filter(priority=51)
        self.assertEqual(len(n), 1)

        gdb.add_gesture('T', [TGesture], priority=52)
        n = gdb.filter(priority=[0, 51])
        self.assertEqual(len(n), 1)
        n = gdb.filter(priority=[0, 52])
        self.assertEqual(len(n), 2)
        n = gdb.filter(priority=[51, 52])
        self.assertEqual(len(n), 2)
        n = gdb.filter(priority=[52, 53])
        self.assertEqual(len(n), 1)
        n = gdb.filter(priority=[53, 54])
        self.assertEqual(len(n), 0)
Exemplo n.º 38
0
 def test_name_filter(self):
     gdb = Recognizer(db=[self.Ninvar, self.Nbound])
     n = gdb.filter()
     self.assertEqual(len(n), 2)
     n = gdb.filter(name='X')
     self.assertEqual(len(n), 0)
Exemplo n.º 39
0
    def test_priority_filter(self):
        gdb = Recognizer(db=[self.Ninvar, self.Nbound])
        n = gdb.filter(priority=50)
        self.assertEqual(len(n), 0)

        gdb.add_gesture('T', [TGesture], priority=51)
        n = gdb.filter(priority=50)
        self.assertEqual(len(n), 0)
        n = gdb.filter(priority=51)
        self.assertEqual(len(n), 1)

        gdb.add_gesture('T', [TGesture], priority=52)
        n = gdb.filter(priority=[0, 51])
        self.assertEqual(len(n), 1)
        n = gdb.filter(priority=[0, 52])
        self.assertEqual(len(n), 2)
        n = gdb.filter(priority=[51, 52])
        self.assertEqual(len(n), 2)
        n = gdb.filter(priority=[52, 53])
        self.assertEqual(len(n), 1)
        n = gdb.filter(priority=[53, 54])
        self.assertEqual(len(n), 0)