def stats(points): global prop_max, prop_min, angle_max, angle_min, rot_max, angle_diff_max, angle_diff_min a = length(vector(points[0], points[1])) b = length(vector(points[1], points[2])) c = length(vector(points[2], points[3])) d = length(vector(points[3], points[0])) if a > c: a, c = c, a if b > d: b, d = d, b if c == 0.0: pass else: # print "sides a/c:", a/c if (c - a) / c > prop_max: prop_max = (c - a) / c if (c - a) / c < prop_min: prop_min = (c - a) / c if d == 0.0: pass else: # print "sides b/d", b/d if (d - b) / d > prop_max: prop_max = (d - b) / d if (d - b) / d < prop_min: prop_min = (d - b) / d corners = Corner.get_corners(points) for cor in corners: if cor.angle < angle_min: angle_min = cor.angle if cor.angle > angle_max: angle_max = cor.angle if cor.rotation > rot_max: rot_max = cor.rotation a, b, c, d = [c.angle for c in corners] if a > c: a, c = c, a if b > d: b, d = d, b if (c - a) / c > angle_diff_max: angle_diff_max = (c - a) / c if (c - a) / c < angle_diff_min: angle_diff_min = (c - a) / c # print "angle diff a/c", (c-a)/c if (d - b) / d > angle_diff_max: angle_diff_max = (d - b) / d if (d - b) / d < angle_diff_min: angle_diff_min = (d - b) / d # print "angle diff b/d", (d-b)/d if angle_diff_max > 0.90: pass
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 stats(points): global prop_max, prop_min, angle_max, angle_min, rot_max, angle_diff_max, angle_diff_min a = length(vector(points[0], points[1])) b = length(vector(points[1], points[2])) c = length(vector(points[2], points[3])) d = length(vector(points[3], points[0])) if a > c: a, c = c, a if b > d: b, d = d, b if c == 0.0: pass else: #print "sides a/c:", a/c if (c - a) / c > prop_max: prop_max = (c - a) / c if (c - a) / c < prop_min: prop_min = (c - a) / c if d == 0.0: pass else: #print "sides b/d", b/d if (d - b) / d > prop_max: prop_max = (d - b) / d if (d - b) / d < prop_min: prop_min = (d - b) / d corners = Corner.get_corners(points) for cor in corners: if cor.angle < angle_min: angle_min = cor.angle if cor.angle > angle_max: angle_max = cor.angle if cor.rotation > rot_max: rot_max = cor.rotation a, b, c, d = [c.angle for c in corners] if a > c: a, c = c, a if b > d: b, d = d, b if (c - a) / c > angle_diff_max: angle_diff_max = (c - a) / c if (c - a) / c < angle_diff_min: angle_diff_min = (c - a) / c #print "angle diff a/c", (c-a)/c if (d - b) / d > angle_diff_max: angle_diff_max = (d - b) / d if (d - b) / d < angle_diff_min: angle_diff_min = (d - b) / d #print "angle diff b/d", (d-b)/d if angle_diff_max > 0.90: pass
def set_new_position(self, points_or_corners, offset=True, scale=1): ''' Sets new position for this marker using points (in order) @param points_or_corners: list of points or corners @param offset: if true, image ROI is checked and points are shifted ''' if len(points_or_corners) > 0 and type(points_or_corners[0]) == tuple: self.predicted = -1 points = points_or_corners img = self.m_d.img (x, y, _, _) = rect = cv.GetImageROI(img) if offset and (x, y) <> (0, 0): points = map(lambda z: add((x, y), z), points) cv.ResetImageROI(img) crit = (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 30, 0.1) if (scale > 1): points = cv.FindCornerSubPix(self.m_d.gray_img, points, (scale * 2 + 4, scale * 2 + 4), (-1, -1), crit) else: points = cv.FindCornerSubPix(self.m_d.gray_img, points, (3, 3), (-1, -1), crit) ncorners = Corner.get_corners(points, self.m_d.time) if len(self.corners) <> 0: for i, cor in enumerate(ncorners): cor.compute_change(self.corners[i]) cv.SetImageROI(img, rect) else: ncorners = points_or_corners self.predicted += len(filter(lambda x: x.is_predicted, ncorners)) for i, c in enumerate(ncorners): c.black_inside = self.black_inside # if len(self.corners)==4: # if dist_points(c.p, self.corners[i].p)<4: # c.p=self.corners[i].p self.corners = ncorners self.area = abs(cv.ContourArea(self.points)) self.last_seen = self.m_d.time self.model_view = None
def set_new_position(self, points_or_corners, offset=True, scale=1): ''' Sets new position for this marker using points (in order) @param points_or_corners: list of points or corners @param offset: if true, image ROI is checked and points are shifted ''' if len(points_or_corners) > 0 and type(points_or_corners[0]) == tuple: self.predicted = -1 points = points_or_corners img = self.m_d.img (x, y, _, _) = rect = cv.GetImageROI(img) if offset and (x, y) <> (0, 0): points = map(lambda z: add((x, y), z), points) cv.ResetImageROI(img) crit = (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 30, 0.1) if (scale > 1): points = cv.FindCornerSubPix(self.m_d.gray_img, points, (scale * 2 + 4, scale * 2 + 4), (-1, -1), crit) else: points = cv.FindCornerSubPix(self.m_d.gray_img, points, (3, 3), (-1, -1), crit) ncorners = Corner.get_corners(points, self.m_d.time) if len(self.corners) <> 0: for i, cor in enumerate(ncorners): cor.compute_change(self.corners[i]) cv.SetImageROI(img, rect) else: ncorners = points_or_corners self.predicted += len(filter(lambda x:x.is_predicted, ncorners)) for i,c in enumerate(ncorners): c.black_inside=self.black_inside # if len(self.corners)==4: # if dist_points(c.p, self.corners[i].p)<4: # c.p=self.corners[i].p self.corners = ncorners self.area = abs(cv.ContourArea(self.points)) self.last_seen = self.m_d.time self.model_view = None