You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

97 lines
2.8 KiB

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