112 lines
3.6 KiB
Python
112 lines
3.6 KiB
Python
|
||
import numpy as np
|
||
|
||
class AbdomenData:
|
||
def __init__(self):
|
||
"""
|
||
初始化处理器,设置默认值
|
||
"""
|
||
self.vertices = [] # 腹部四个顶点
|
||
self.navel_point = None # 肚脐眼坐标
|
||
self.length = 0 # 腹部长度
|
||
self.width = 0 # 腹部宽度
|
||
|
||
def load_data(self, json_data):
|
||
"""
|
||
加载并处理JSON数据
|
||
|
||
Args:
|
||
json_data: 包含标注信息的JSON数据字典
|
||
"""
|
||
self._process_data(json_data)
|
||
return self
|
||
|
||
def _calculate_distance(self, point1, point2):
|
||
"""计算两点之间的欧几里得距离"""
|
||
return np.sqrt((point2[0] - point1[0])**2 + (point2[1] - point1[1])**2)
|
||
|
||
def _process_data(self, json_data):
|
||
"""处理JSON数据,提取所需信息"""
|
||
for shape in json_data.get('shapes', []):
|
||
label = shape['label']
|
||
points = shape['points']
|
||
|
||
if shape['shape_type'] == 'polygon' and label == 'fubu':
|
||
# 存储四个顶点坐标
|
||
self.vertices = [tuple(map(float, point)) for point in points]
|
||
|
||
# 计算长和宽
|
||
self.length = self._calculate_distance(points[0], points[1]) # 第1点和第2点之间的距离
|
||
self.width = self._calculate_distance(points[1], points[2]) # 第2点和第3点之间的距离
|
||
|
||
elif shape['shape_type'] == 'point' and label == 'duqiyan':
|
||
# 存储肚脐眼坐标
|
||
self.navel_point = tuple(map(float, points[0]))
|
||
|
||
def get_all_data(self):
|
||
"""获取所有处理后的数据"""
|
||
return {
|
||
'vertices': self.vertices,
|
||
'navel_point': self.navel_point,
|
||
'dimensions': {
|
||
'length': self.length,
|
||
'width': self.width
|
||
}
|
||
}
|
||
|
||
def get_vertices(self):
|
||
"""获取四个顶点坐标"""
|
||
return self.vertices
|
||
|
||
def get_navel_point(self):
|
||
"""获取肚脐眼坐标"""
|
||
return self.navel_point
|
||
|
||
def get_dimensions(self):
|
||
"""获取长度和宽度"""
|
||
return {
|
||
'length': self.length,
|
||
'width': self.width
|
||
}
|
||
|
||
# 使用示例
|
||
if __name__ == "__main__":
|
||
# 示例JSON数据
|
||
sample_json = {
|
||
"version": "5.6.0",
|
||
"flags": {},
|
||
"shapes": [
|
||
{
|
||
"label": "fubu",
|
||
"points": [
|
||
[263.12977099236645, 119.96183206106873],
|
||
[451.2977099236641, 140.19083969465652],
|
||
[439.0839694656489, 243.24427480916032],
|
||
[250.53435114503822, 218.4351145038168]
|
||
],
|
||
"shape_type": "polygon"
|
||
},
|
||
{
|
||
"label": "duqiyan",
|
||
"points": [[358.5496183206107, 184.84732824427482]],
|
||
"shape_type": "point"
|
||
}
|
||
]
|
||
}
|
||
|
||
# 创建处理器实例并加载数据
|
||
processor = AbdomenData().load_data(sample_json)
|
||
|
||
# 获取所有数据
|
||
all_data = processor.get_all_data()
|
||
|
||
# 打印结果
|
||
# print("四个顶点坐标:")
|
||
for i, vertex in enumerate(processor.get_vertices(), 1):
|
||
print(f"vertex {i}: {vertex}")
|
||
|
||
print(f"\position : {processor.get_navel_point()}")
|
||
|
||
dimensions = processor.get_dimensions()
|
||
print(f"\nlength: {dimensions['length']:.2f}")
|
||
print(f"width: {dimensions['width']:.2f}") |