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