ReUseX
0.0.5
3D Point Cloud Processing for Building Reuse
Toggle main menu visibility
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
9
namespace
reusex::vision::tensor_rt::affine
{
10
11
struct
CropResizeMatrix
{
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
46
struct
ResizeMatrix
{
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
94
struct
LetterBoxMatrix
{
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
reusex::vision::tensor_rt::affine
Definition
affine.hpp:9
reusex::vision::tensor_rt::affine::CropResizeMatrix
Definition
affine.hpp:11
reusex::vision::tensor_rt::affine::CropResizeMatrix::compute
void compute(const std::tuple< int, int > &from, const std::tuple< int, int > &to, const std::tuple< int, int > &start)
Definition
affine.hpp:15
reusex::vision::tensor_rt::affine::CropResizeMatrix::i2d
float i2d[6]
Definition
affine.hpp:12
reusex::vision::tensor_rt::affine::CropResizeMatrix::d2i
float d2i[6]
Definition
affine.hpp:13
reusex::vision::tensor_rt::affine::LetterBoxMatrix
Definition
affine.hpp:94
reusex::vision::tensor_rt::affine::LetterBoxMatrix::d2i
float d2i[6]
Definition
affine.hpp:96
reusex::vision::tensor_rt::affine::LetterBoxMatrix::i2d
float i2d[6]
Definition
affine.hpp:95
reusex::vision::tensor_rt::affine::LetterBoxMatrix::compute
void compute(const std::tuple< int, int > &from, const std::tuple< int, int > &to)
Definition
affine.hpp:98
reusex::vision::tensor_rt::affine::ResizeMatrix
Definition
affine.hpp:46
reusex::vision::tensor_rt::affine::ResizeMatrix::i2d
float i2d[6]
Definition
affine.hpp:47
reusex::vision::tensor_rt::affine::ResizeMatrix::d2i
float d2i[6]
Definition
affine.hpp:48
reusex::vision::tensor_rt::affine::ResizeMatrix::compute
void compute(const std::tuple< int, int > &from, const std::tuple< int, int > &to)
Definition
affine.hpp:50
libs
reusex
include
vision
tensor_rt
common
affine.hpp
Generated by
1.17.0