from dataclasses import dataclass, field from typing import Optional from dataclasses_json import dataclass_json, config @dataclass_json @dataclass class Point: x:float y:float def __iter__(self): # 使对象可迭代,可直接转为元组 yield self.x yield self.y @dataclass class RectangleArea: x: int y: int w: int h: int @classmethod def from_dict(cls, data: dict): return cls( x=data['x'], y=data['y'], w=data['w'], h = data['h']) @dataclass class Threshold: binary: int gauss: int @dataclass_json @dataclass class TargetInfo: # 标靶方形区域 rectangle_area:RectangleArea threshold:Threshold radius_pix:float= 1 # 标靶物理半径 radius:float=0.0 pix_length:float=0.0 id:int =-1 desc:str="" base:bool=False def __init__(self,id,desc,rectangle_area:RectangleArea,radius,threshold:Threshold,base:bool,**kwargs): self.id = id self.desc = desc self.rectangle_area=rectangle_area self.radius=radius self.threshold=threshold self.base=base @classmethod def from_dict(cls,data: dict): return cls(data['id'],data['rectangle_area'],data['radius']) @dataclass_json @dataclass class CircleTarget: # 标靶方形区域 info:TargetInfo # 初始标靶中心 is_init=True # 标靶中心 center_point: Optional[Point]= field(default=None, metadata=config(exclude=lambda x: x is None)) center_init : Optional[Point]= field(default=None, metadata=config(exclude=lambda x: x is None)) # 标靶位移(像素) displacement_pix: Optional[Point]= field(default=None, metadata=config(exclude=lambda x: x is None)) displacement_phy: Optional[Point]= field(default=None, metadata=config(exclude=lambda x: x is None)) def __init__(self,info:TargetInfo,center_point,center_init,displacement_pix,displacement_phy): self.info=info self.center_point=center_point self.center_init=center_init self. displacement_pix=displacement_pix self.displacement_phy=displacement_phy @classmethod def init_by_info(cls,t:TargetInfo): return CircleTarget(t,None,None,None,None) def circle_displacement(self): previous = self.center_init if previous != (): self.displacement_pix = Point(self.center_point.x - previous.x, self.center_point.y - previous.y) if self.info.radius != 0: # 单位像素距离 self.info.pix_length = self.info.radius / self.info.radius_pix offset_x = round(float(self.displacement_pix.x * self.info.pix_length), 5) offset_y = round(float(self.displacement_pix.y * self.info.pix_length), 5) self.displacement_phy = Point(offset_x, offset_y) return self