Beispiel #1
0
    def find_corners(self):
        '''
        Tries to find corners or to predict them. Return empty list,
        if every corner is found, or list of points in the area which tell where
        to do futher checking
        '''
        time = self.m_d.time
        if time-self.last_seen >= MAX_SEEN:
            return False
        #cv.ResetImageROI(draw_img)
        ncorners = []
        bounds = []
        for c in self.corners:
            db.db_break("find_corners")
            cands = c.get_candidates(self.m_d)
            min = NOT_SIMILLAR;
            bestcand = None;
            for cand in cands:
                if cand.similarity < min:
                    min = cand.similarity;
                    bestcand = cand
            ncorners.append(bestcand)
            bounds.extend(cvrect(cv.GetImageROI(self.m_d.bw_img)))
            if bestcand is None:
                pass

        db.pr([ncorners], "find_corners")
        for cor in ncorners:
            if cor is not None:
                cor.draw(self.m_d.tmp_img)
        if None in ncorners:
            pass
        CP = CornerPredictor(self.corners, time, self.m_d)
        ncorners = CP.predict_corners(ncorners)
        db.pr([ncorners], "new corners")
        if ncorners is not None:
            points = [x.p for x in ncorners]
            correctness = self.code_correctness(points)
            if correctness>REQUIRED_CORRECTNESS:
                self.set_new_position(ncorners)
                return True
            else:
                db.PolyLine(self.m_d.tmp_img,[points], True, (255,255,255),
                            "%.2f"%correctness)
        self.m_d.borders.extend(CP.bounds)
        return False
Beispiel #2
0
    def find_corners(self):
        '''
        Tries to find corners or to predict them. Return empty list,
        if every corner is found, or list of points in the area which tell where
        to do futher checking
        '''
        time = self.m_d.time
        if time - self.last_seen >= MAX_SEEN:
            return False
        #cv.ResetImageROI(draw_img)
        ncorners = []
        bounds = []
        for c in self.corners:
            db.db_break("find_corners")
            cands = c.get_candidates(self.m_d)
            min = NOT_SIMILLAR
            bestcand = None
            for cand in cands:
                if cand.similarity < min:
                    min = cand.similarity
                    bestcand = cand
            ncorners.append(bestcand)
            bounds.extend(cvrect(cv.GetImageROI(self.m_d.bw_img)))
            if bestcand is None:
                pass

        db.pr([ncorners], "find_corners")
        for cor in ncorners:
            if cor is not None:
                cor.draw(self.m_d.tmp_img)
        if None in ncorners:
            pass
        CP = CornerPredictor(self.corners, time, self.m_d)
        ncorners = CP.predict_corners(ncorners)
        db.pr([ncorners], "new corners")
        if ncorners is not None:
            points = [x.p for x in ncorners]
            correctness = self.code_correctness(points)
            if correctness > REQUIRED_CORRECTNESS:
                self.set_new_position(ncorners)
                return True
            else:
                db.PolyLine(self.m_d.tmp_img, [points], True, (255, 255, 255),
                            "%.2f" % correctness)
        self.m_d.borders.extend(CP.bounds)
        return False
 def _test_improve_corners(self, a, b):
     cv.FillConvexPoly(self.draw_img, self.points, (255, 255, 255))
    # cv.Circle(self.draw_img, (75,30), 20, (0,0,0),4)
     ncorners = self._prepare_corners(self.points)
     CP = CornerPredictor(self.corners, 1, self.draw_img, self.timg,self.tmp_img)
     ncorners[a] = None
     ncorners[b] = None
     corners = CP._improve_corners(ncorners)
     for i in filter(lambda x: (x <> a and x <> b), range(4)):
         ea = r2d(self.corners[i].angle)
         print '-----',ncorners[i].prev,ncorners[i].p, ncorners[i].next, corners[i].prev, corners[i].next 
         na = r2d(ncorners[i].angle)
         ra = r2d(corners[i].angle)
         self.assertTrue(abs(ea - ra) <= abs(ea-na), 'Angle of [%d] not improved: \
                                     expected %f received %f previous %f' % (i, ea, ra, na))
         ea = r2d(self.corners[i].rotation)
         na = r2d(ncorners[i].rotation)
         ra = r2d(corners[i].rotation)
         self.assertTrue(abs(ea - ra) <= abs(ea-na) , 'rotation of [%d] not improved: \
                                     expected %f received %f previous %f' % (i, ea, ra, na))                            
 def _predict(self,npoints):
     cv.FillConvexPoly(self.draw_img, npoints, (0,0,0))
     corners = Corner.get_corners(npoints)
     tcorners = list(corners)
     for i,cor in enumerate(corners):
         print cor.p
         if not(0<=cor.p[0]<self.size and 0<=cor.p[1]<self.size):
             tcorners[i]=None
     
     CP = CornerPredictor(self.corners, 1, self.tmp_img, self.timg, self.draw_img)
     print "predicting....",tcorners
     ncorners = CP.predict_corners(tcorners)
     print 'done'
     for i,cor in enumerate(ncorners):
         v=vector(corners[i].p,cor.p)
         print length(v), cor.toString()
         self.assertTrue(length(v)<5,"Wrong prediction!Corner: %d \
         Expected: (%d,%d) received (%d,%d)" \
         %(i,corners[i].p[0],corners[i].p[1],cor.p[0],cor.p[1]))
     print ncorners  
 def test_validate_corners(self):
     print self.corners
     print self.old_corners
     ncorners = self._prepare_corners(self.points)
     c= ncorners[0]
     prev = add(c.prev,(2,0))
     p = add(c.p,(1,1))
     next= add(c.next,(2,0))
     ncorners[0] = Corner([prev,p,next],1,imgtime=2)
     ncorners[0].compute_change(self.corners[0])
     res = list(ncorners)
     res[0]=None
     print ncorners
     for i,cor in enumerate(ncorners):
         cor.draw(self.draw_img)
         cor.compute_change(self.corners[i])
     db.show(self.draw_img,"main")
     CP = CornerPredictor(self.corners, 1, self.tmp_img, self.timg, self.draw_img)
     CP.validate_corners(ncorners)
     self.assertEqual(ncorners,res,
                      "First corner is invalid:"+ncorners.__repr__())