ReUseX  0.0.1
3D Point Cloud Processing for Building Reuse
Loading...
Searching...
No Matches
affine.hpp
Go to the documentation of this file.
1#pragma once
2#include <algorithm>
3#include <tuple>
4
6
8 float i2d[6]; // image to dst(network), 2x3 matrix
9 float d2i[6]; // dst to image, 2x3 matrix
10
11 void compute(const std::tuple<int, int> &from, const std::tuple<int, int> &to,
12 const std::tuple<int, int> &start) {
13 float scale_x = std::get<0>(to) / (float)std::get<0>(from);
14 float scale_y = std::get<1>(to) / (float)std::get<1>(from);
15 int start_x = std::get<0>(start);
16 int start_y = std::get<1>(start);
17
18 // crop resize
19 i2d[0] = scale_x;
20 i2d[1] = 0.0f;
21 i2d[2] = -scale_x * start_x;
22 i2d[3] = 0.0f;
23 i2d[4] = scale_y;
24 i2d[5] = -scale_y * start_y;
25
26 double D = i2d[0] * i2d[4] - i2d[1] * i2d[3];
27 D = D != 0. ? double(1.) / D : double(0.);
28 double A11 = i2d[4] * D, A22 = i2d[0] * D, A12 = -i2d[1] * D,
29 A21 = -i2d[3] * D;
30 double b1 = -A11 * i2d[2] - A12 * i2d[5];
31 double b2 = -A21 * i2d[2] - A22 * i2d[5];
32
33 d2i[0] = A11;
34 d2i[1] = A12;
35 d2i[2] = b1;
36 d2i[3] = A21;
37 d2i[4] = A22;
38 d2i[5] = b2;
39 }
40};
41
43 float i2d[6]; // image to dst(network), 2x3 matrix
44 float d2i[6]; // dst to image, 2x3 matrix
45
46 void compute(const std::tuple<int, int> &from,
47 const std::tuple<int, int> &to) {
48 float scale_x = std::get<0>(to) / (float)std::get<0>(from);
49 float scale_y = std::get<1>(to) / (float)std::get<1>(from);
50 float scale = std::min(scale_x, scale_y);
51
52 // resize
53 // i2d[0] = scale_x;
54 // i2d[1] = 0;
55 // i2d[2] = 0;
56 // i2d[3] = 0;
57 // i2d[4] = scale_y;
58 // i2d[5] = 0;
59
60 // double D = i2d[0] * i2d[4] - i2d[1] * i2d[3];
61 // D = D != 0. ? double(1.) / D : double(0.);
62 // double A11 = i2d[4] * D, A22 = i2d[0] * D, A12 = -i2d[1] * D,
63 // A21 = -i2d[3] * D;
64 // double b1 = -A11 * i2d[2] - A12 * i2d[5];
65 // double b2 = -A21 * i2d[2] - A22 * i2d[5];
66
67 // d2i[0] = A11;
68 // d2i[1] = A12;
69 // d2i[2] = b1;
70 // d2i[3] = A21;
71 // d2i[4] = A22;
72 // d2i[5] = b2;
73
74 float inv_scale_x = 1.0f / scale_x;
75 float inv_scale_y = 1.0f / scale_y;
76
77 d2i[0] = inv_scale_x;
78 d2i[1] = 0;
79 d2i[3] = 0;
80 d2i[4] = inv_scale_y;
81
82 // --- Core modification Start ---
83 // Add 0.5 offset compensation to match PIL/OpenCV center alignment logic
84 // Formula: translation = 0.5 * scale - 0.5
85 d2i[2] = 0.5f * inv_scale_x - 0.5f;
86 d2i[5] = 0.5f * inv_scale_y - 0.5f;
87 }
88};
89
91 float i2d[6]; // image to dst(network), 2x3 matrix
92 float d2i[6]; // dst to image, 2x3 matrix
93
94 void compute(const std::tuple<int, int> &from,
95 const std::tuple<int, int> &to) {
96 float scale_x = std::get<0>(to) / (float)std::get<0>(from);
97 float scale_y = std::get<1>(to) / (float)std::get<1>(from);
98 float scale = std::min(scale_x, scale_y);
99
100 // letter box
101 i2d[0] = scale;
102 i2d[1] = 0;
103 i2d[2] = -scale * std::get<0>(from) * 0.5 + std::get<0>(to) * 0.5 +
104 scale * 0.5 - 0.5;
105 i2d[3] = 0;
106 i2d[4] = scale;
107 i2d[5] = -scale * std::get<1>(from) * 0.5 + std::get<1>(to) * 0.5 +
108 scale * 0.5 - 0.5;
109
110 double D = i2d[0] * i2d[4] - i2d[1] * i2d[3];
111 D = D != 0. ? double(1.) / D : double(0.);
112 double A11 = i2d[4] * D, A22 = i2d[0] * D, A12 = -i2d[1] * D,
113 A21 = -i2d[3] * D;
114 double b1 = -A11 * i2d[2] - A12 * i2d[5];
115 double b2 = -A21 * i2d[2] - A22 * i2d[5];
116
117 d2i[0] = A11;
118 d2i[1] = A12;
119 d2i[2] = b1;
120 d2i[3] = A21;
121 d2i[4] = A22;
122 d2i[5] = b2;
123 }
124};
125
126} // namespace ReUseX::vision::tensor_rt::affine
void compute(const std::tuple< int, int > &from, const std::tuple< int, int > &to, const std::tuple< int, int > &start)
Definition affine.hpp:11
void compute(const std::tuple< int, int > &from, const std::tuple< int, int > &to)
Definition affine.hpp:94
void compute(const std::tuple< int, int > &from, const std::tuple< int, int > &to)
Definition affine.hpp:46