File size: 5,492 Bytes
4555cad |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# Coordinate system utilities for dwpose-editor
import numpy as np
class CoordinateTransformer:
def __init__(self, data_resolution=(512, 512), display_resolution=(640, 640)):
"""
座標変換システム
Args:
data_resolution: ポーズデータの解像度 (width, height)
display_resolution: Canvas表示解像度 (width, height)
"""
self.data_resolution = data_resolution
self.display_resolution = display_resolution
self.scale_x = display_resolution[0] / data_resolution[0]
self.scale_y = display_resolution[1] / data_resolution[1]
def data_to_display(self, x, y):
"""データ座標系から表示座標系に変換"""
return {
'x': x * self.scale_x,
'y': y * self.scale_y
}
def display_to_data(self, x, y):
"""表示座標系からデータ座標系に変換"""
return {
'x': x / self.scale_x,
'y': y / self.scale_y
}
def transform_pose_data(self, pose_data):
"""ポーズデータ全体を表示座標系に変換"""
if not pose_data:
return pose_data
transformed_data = pose_data.copy()
# ボディキーポイントの変換
if 'bodies' in transformed_data and 'candidate' in transformed_data['bodies']:
candidates = []
for point in transformed_data['bodies']['candidate']:
if len(point) >= 2:
transformed = self.data_to_display(point[0], point[1])
new_point = [transformed['x'], transformed['y']]
if len(point) > 2:
new_point.extend(point[2:]) # 信頼度などを保持
candidates.append(new_point)
else:
candidates.append(point)
transformed_data['bodies']['candidate'] = candidates
# 手キーポイントの変換
if 'hands' in transformed_data:
transformed_hands = []
for hand in transformed_data['hands']:
if hand and len(hand) > 0:
transformed_hand = []
for i in range(0, len(hand), 3):
if i + 1 < len(hand):
transformed = self.data_to_display(hand[i], hand[i + 1])
transformed_hand.extend([transformed['x'], transformed['y']])
if i + 2 < len(hand):
transformed_hand.append(hand[i + 2]) # 信頼度
else:
transformed_hand.append(hand[i])
transformed_hands.append(transformed_hand)
else:
transformed_hands.append(hand)
transformed_data['hands'] = transformed_hands
# 顔キーポイントの変換
if 'faces' in transformed_data:
transformed_faces = []
for face in transformed_data['faces']:
if face and len(face) > 0:
transformed_face = []
for i in range(0, len(face), 3):
if i + 1 < len(face):
transformed = self.data_to_display(face[i], face[i + 1])
transformed_face.extend([transformed['x'], transformed['y']])
if i + 2 < len(face):
transformed_face.append(face[i + 2]) # 信頼度
else:
transformed_face.append(face[i])
transformed_faces.append(transformed_face)
else:
transformed_faces.append(face)
transformed_data['faces'] = transformed_faces
return transformed_data
def update_resolution(self, data_resolution=None, display_resolution=None):
"""解像度設定の更新"""
if data_resolution:
self.data_resolution = data_resolution
if display_resolution:
self.display_resolution = display_resolution
self.scale_x = self.display_resolution[0] / self.data_resolution[0]
self.scale_y = self.display_resolution[1] / self.data_resolution[1]
def get_scale_factors(self):
"""スケール係数を取得"""
return {
'scale_x': self.scale_x,
'scale_y': self.scale_y,
'data_resolution': self.data_resolution,
'display_resolution': self.display_resolution
}
# グローバル座標変換器
default_transformer = CoordinateTransformer()
def transform_point_to_display(x, y):
"""ポイントを表示座標系に変換"""
return default_transformer.data_to_display(x, y)
def transform_point_to_data(x, y):
"""ポイントをデータ座標系に変換"""
return default_transformer.display_to_data(x, y)
def transform_pose_to_display(pose_data):
"""ポーズデータを表示座標系に変換"""
return default_transformer.transform_pose_data(pose_data)
def update_coordinate_system(data_resolution, display_resolution):
"""座標系設定を更新"""
default_transformer.update_resolution(data_resolution, display_resolution)
def get_coordinate_info():
"""座標系情報を取得"""
return default_transformer.get_scale_factors() |