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