def map_to_uncalibration(self, pos, cpos=None, rot=None, scale=None): cpos, rot, scale = self._get_calibration_params(cpos, rot, scale) a = AffineTransform() a.scale(1 / scale, 1 / scale) a.rotate(-rot) a.translate(cpos[0], cpos[1]) # a.translate(-cpos[0], -cpos[1]) # a.translate(*cpos) # a.rotate(-rot) # a.translate(-cpos[0], -cpos[1]) pos = a.transform(*pos) return pos
def map_to_calibration(self, pos, cpos=None, rot=None, use_modified=False, scale=None, translate=None): cpos, rot, scale = self._get_calibration_params(cpos, rot, scale) a = AffineTransform() # if translate: # a.translate(*translate) # if scale: a.scale(scale, scale) if use_modified: a.translate(*cpos) # print cpos, rot, scale a.rotate(rot) a.translate(-cpos[0], -cpos[1]) if use_modified: a.translate(*cpos) pos = a.transform(*pos) return pos
class UVAnalysisImage(ImageViewer): open_button = Button define_points = Button define_points_label = String _defining_points = False #=============================================================================== # handlers #=============================================================================== def _set_reference_point(self, pt): ''' assumes no rotation of the reference frames only scale and translate ''' rp = ReferencePoint(pt) info = rp.edit_traits() if info.result: plot = self.plot self.points.append(((rp.x, rp.y), pt)) # if not self.reference_pt1: # self.reference_pt1 = (rp.x, rp.y), pt # else: # # calculate bounds # dp1, sp1 = self.reference_pt1 # dp2, sp2 = (rp.x, rp.y), pt # # # w = plot.width # h = plot.height # if sp1[0] < sp2[0]: # sx1, sx2 = sp1[0], sp2[0] # x1, x2 = dp1[0], dp2[0] # else: # sx2, sx1 = sp1[0], sp2[0] # x2, x1 = dp1[0], dp2[0] # # if sp1[1] < sp2[1]: # sy1, sy2 = sp1[1], sp2[1] # y1, y2 = dp1[1], dp2[1] # else: # sy2, sy1 = sp1[1], sp2[1] # y2, y1 = dp1[1], dp2[1] # # pxperunit = abs((sx2 - sx1) / (x2 - x1)) # # li = x1 - sx1 / pxperunit # hi = x2 + (w - sx2) / pxperunit # lv = y1 - sy1 / pxperunit # hv = y2 + (h - sy2) / pxperunit # # plot.index_range.low_setting = li # plot.index_range.high_setting = hi # plot.value_range.low_setting = lv # plot.value_range.high_setting = hv # plot.request_redraw() def _define_points_fired(self): if self.plot: plot = self.plot if not self._defining_points: self.points = [] st = ReferencePointsTool(plot) st.on_trait_change(self._set_reference_point, 'current_position') self.points_tool = st plot.tools.insert(0, st) self.define_points_label = 'Finish' plot.overlays.append( ReferencePointsOverlay(tool=st, component=plot)) else: self.define_points_label = 'Define Points' self.points_tool.on_trait_change(self._set_reference_point, 'current_position', remove=True) plot.tools.pop(0) plot.overlays.pop(-1) self._calculate_affine_transform(self.points) self._defining_points = not self._defining_points def load_points(self, path): points = [(100, 100), (300, 400), (200, 300)] if os.path.isfile(path): points = loadtxt(path, delimiter=',') po = PointOverlay(component=self.plot, points=points) self.plot.overlays.append(po) def _calculate_affine_transform(self, pts): rps, ps = zip(*pts) s, r, t = calculate_rigid_transform(rps, ps) self.A = AffineTransform() self.A.scale(s, s) self.A.rotate(r) self.A.translate(-t[0], -t[1]) print self.A def traits_view(self): image = Item('container', style='custom', show_label=False, editor=ComponentEditor()) v = View(Item('open_button', show_label=False), Item('define_points', enabled_when='plot', editor=ButtonEditor(label_value='define_points_label'), show_label=False), image, resizable=True) return v
class UVAnalysisImage(ImageViewer): open_button = Button define_points = Button define_points_label = String _defining_points = False #=============================================================================== # handlers #=============================================================================== def _set_reference_point(self, pt): ''' assumes no rotation of the reference frames only scale and translate ''' rp = ReferencePoint(pt) info = rp.edit_traits() if info.result: plot = self.plot self.points.append(((rp.x, rp.y), pt)) # if not self.reference_pt1: # self.reference_pt1 = (rp.x, rp.y), pt # else: # # calculate bounds # dp1, sp1 = self.reference_pt1 # dp2, sp2 = (rp.x, rp.y), pt # # # w = plot.width # h = plot.height # if sp1[0] < sp2[0]: # sx1, sx2 = sp1[0], sp2[0] # x1, x2 = dp1[0], dp2[0] # else: # sx2, sx1 = sp1[0], sp2[0] # x2, x1 = dp1[0], dp2[0] # # if sp1[1] < sp2[1]: # sy1, sy2 = sp1[1], sp2[1] # y1, y2 = dp1[1], dp2[1] # else: # sy2, sy1 = sp1[1], sp2[1] # y2, y1 = dp1[1], dp2[1] # # pxperunit = abs((sx2 - sx1) / (x2 - x1)) # # li = x1 - sx1 / pxperunit # hi = x2 + (w - sx2) / pxperunit # lv = y1 - sy1 / pxperunit # hv = y2 + (h - sy2) / pxperunit # # plot.index_range.low_setting = li # plot.index_range.high_setting = hi # plot.value_range.low_setting = lv # plot.value_range.high_setting = hv # plot.request_redraw() def _define_points_fired(self): if self.plot: plot = self.plot if not self._defining_points: self.points = [] st = ReferencePointsTool(plot) st.on_trait_change(self._set_reference_point, 'current_position') self.points_tool = st plot.tools.insert(0, st) self.define_points_label = 'Finish' plot.overlays.append(ReferencePointsOverlay(tool=st, component=plot)) else: self.define_points_label = 'Define Points' self.points_tool.on_trait_change(self._set_reference_point, 'current_position', remove=True) plot.tools.pop(0) plot.overlays.pop(-1) self._calculate_affine_transform(self.points) self._defining_points = not self._defining_points def load_points(self, path): points = [(100, 100), (300, 400), (200, 300) ] if os.path.isfile(path): points = loadtxt(path, delimiter=',') po = PointOverlay(component=self.plot, points=points ) self.plot.overlays.append(po) def _calculate_affine_transform(self, pts): rps, ps = zip(*pts) s, r, t = calculate_rigid_transform(rps, ps) self.A = AffineTransform() self.A.scale(s, s) self.A.rotate(r) self.A.translate(-t[0], -t[1]) print self.A def traits_view(self): image = Item('container', style='custom', show_label=False, editor=ComponentEditor() ) v = View( Item('open_button', show_label=False), Item('define_points', enabled_when='plot', editor=ButtonEditor(label_value='define_points_label'), show_label=False), image, resizable=True ) return v