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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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))