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()