def _predict_neighbours(self, a, b, new_corners): if a == b + 1 or (b == 3 and a == 0): a, b = b, a na = (a + 3) % 4 v1 = new_corners[na].get_prediction_vector(False, self.corners[na]) nb = (b + 1) % 4 v2 = new_corners[nb].get_prediction_vector(True, self.corners[nb]) ap = add(new_corners[na].p, v1) bp = add(new_corners[nb].p, v2) cor_a = Corner([new_corners[na].p, ap, bp], 1, imgtime=new_corners[na].time) cor_b = Corner([ap, bp, new_corners[nb].p], 1, imgtime=new_corners[na].time) cor_b.is_predicted = cor_a.is_predicted = True cor_a.compute_change(self.corners[a], self.image) cor_b.compute_change(self.corners[b], self.image) if cor_a.different: if cor_b.different: return else: new_corners[b] = cor_b self._predict_one(a, new_corners) else: new_corners[a] = cor_a if cor_b.different: self._predict_one(b, new_corners) else: new_corners[b] = cor_b
def _predict_from_one(self, a, new_corners): vec = new_corners[a].get_prediction_vector(True, self.corners[a]) pa = (a + 3) % 4 p1 = add(new_corners[a].p, vec) vec = (-vec[0],-vec[1]) vec=rotateVec(vec, self.corners[pa].angle) pp1= add(p1,vec) cor_p = Corner([pp1, p1, new_corners[a].p], 1, imgtime=new_corners[a].time) vec = new_corners[a].get_prediction_vector(False, self.corners[a]) na = (a + 1) % 4 p2 = add(new_corners[a].p, vec) vec = (-vec[0],-vec[1]) vec=rotateVec(vec, self.corners[na].angle) np2= add(p1,vec) cor_n = Corner([new_corners[a].p, p2, np2], 1, imgtime=new_corners[a].time) cor_p.is_predicted = cor_n.is_predicted = True cor_p.compute_change(self.corners[pa], self.image) cor_n.compute_change(self.corners[na], self.image) da= (a + 2) % 4 if cor_p.different: if cor_n.different: return else: new_corners[na] = cor_n self._predict_neighbours(pa, da, new_corners) else: new_corners[pa] = cor_p if cor_n.different: self._predict_neighbours(na, da, new_corners) else: new_corners[na] = cor_n self._predict_one(da, new_corners)
def _predict_one(self, index, new_corners): ''' predict position of corner index @param index: @param new_corners: ''' # predicting by taking vectors form near corners along the sides # and solving linear equation for intersection L = len(new_corners) nb = (index + 1) % L b = new_corners[nb] nd = (index - 1 + L) % L d = new_corners[nd] assert isinstance(b, Corner) v1 = b.get_prediction_vector(True, self.corners[nb]) v2 = d.get_prediction_vector(False, self.corners[nd]) p1 = b.p p2 = d.p (p, _) = solve_linear(v1, v2, p1, p2) point = add(b.p, v1, p) cor = Corner([d.p, point, b.p], imgtime=b.time) cor.compute_change(self.corners[index]) cor.is_predicted = True if cor.similarity < self.avg_sim * 2: new_corners[index] = cor