这是我的代码的输出
共有33个关键点,其中包括
body_pose = ['NOSE', 'LEFT_EYE_INNER', 'LEFT_EYE', 'LEFT_EYE_OUTER', 'RIGHT_EYE_INNER', 'RIGHT_EYE', 'RIGHT_EYE_OUTER', 'LEFT_EAR', 'RIGHT_EAR', 'MOUTH_LEFT', 'MOUTH_RIGHT',
'LEFT_SHOULDER', 'RIGHT_SHOULDER', 'LEFT_ELBOW', 'RIGHT_ELBOW', 'LEFT_WRIST', 'RIGHT_WRIST', 'LEFT_PINKY', 'RIGHT_PINKY', 'LEFT_INDEX', 'RIGHT_INDEX', 'LEFT_THUMB',
'RIGHT_THUMB', 'LEFT_HIP', 'RIGHT_HIP', 'LEFT_KNEE', 'RIGHT_KNEE', 'LEFT_ANKLE', 'RIGHT_ANKLE', 'LEFT_HEEL', 'RIGHT_HEEL', 'LEFT_FOOT_INDEX', 'RIGHT_FOOT_INDEX']
问题是名称
NOSE_x
、NOSE_y
和 NOSE_z
存储在第 0 行 -> 正确
但是下一个周期
LEFT_EYE_INNER_x
、LEFT_EYE_INNER_y
和LEFT_EYE_INNER_z
存储在第1行 -> 错误,因为它们应该存储在第0行的数字0中,
等等
如何将其合并为一排?
这里是我的附加数据代码并将其保存为Excel格式
def save_data_to_excel(self):
data_dict = {pose_type: [] for pose_type in ['pose', 'right_hand', 'left_hand']}
for pose_type, pose_data in self.alldata:
for idx, (key, value) in enumerate(pose_data.items()):
# Append timestamp along with position data
timestamp = datetime.now().strftime("%H:%M:%S.%f")
key_suffix = ['X', 'Y', 'Z']
data_dict[pose_type].append({**{'Number': idx, 'Timestamp': timestamp}, **{f'{key}_{key_suffix[i]}': val for i, val in enumerate(value)}})
#data_row = [idx, timestamp] + [{f'{key}_{key_suffix[i]}': val for i, val in enumerate(value)}]
#data_dict[pose_type].append(data_row)
with pd.ExcelWriter('koordinat.xlsx') as writer:
for pose_type, data in data_dict.items():
df = pd.DataFrame(data)
df.to_excel(writer, sheet_name=pose_type, index=False)
我期望的输出是 33 个关键点和可被 33 整除的时间戳存储在每一行的数字 0、数字 1、数字 2 等位置
访问 Excel 文件的链接:https://docs.google.com/spreadsheets/d/12taz4_8HV8865D80kkEHqEFw3U6o4pZp/edit?rtpof=true&sd=true
我会使用
csv
包并一次读取一行来累积结果。当您看到包含 NOSE_x
数据的行时,这是一个信号,表明您正在开始一个新的最终结果行,并且允许您开始合并最终结果行的数据。
请注意,此示例使用
io.StringIO()
来模拟 open()
,我将打印结果而不是将它们写入文件。我认为您可能可以处理读取和写入文件的问题。
import io ## we will simulate open with io.StringIO()
import csv
raw_data = """
"Timestamp","NOSE_x","NOSE_y","NOSE_z","MOUTH_x","MOUTH_y","MOUTH_z"
1.1,1,2,3,,,
2.2,,,,4,5,6
10.1,10,20,30,,,
20.2,,,,40,50,60
""".strip()
results = []
with io.StringIO(raw_data) as file_in:
reader = csv.DictReader(file_in)
for row in reader:
if row.get("NOSE_x"): # we have a starting result row
result = {}
for key, value in row.items():
if value:
result[key] = value
if row.get("MOUTH_z"): # we have a final result row
results.append(result)
for result in results:
print(result)
这应该给你:
{'Timestamp': '2.2', 'NOSE_x': '1', 'NOSE_y': '2', 'NOSE_z': '3', 'MOUTH_x': '4', 'MOUTH_y': '5', 'MOUTH_z': '6'}
{'Timestamp': '20.2', 'NOSE_x': '10', 'NOSE_y': '20', 'NOSE_z': '30', 'MOUTH_x': '40', 'MOUTH_y': '50', 'MOUTH_z': '60'}