digiKam
Loading...
Searching...
No Matches
pointtransformaffine.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 16/08/2016
7 * Description : point transform class and its utilities that models
8 * affine transformations between two sets of 2d-points.
9 *
10 * SPDX-FileCopyrightText: 2016 by Omar Amin <Omar dot moh dot amin at gmail dot com>
11 * SPDX-FileCopyrightText: 2016-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19// C++ includes
20
21#include <vector>
22#include <iostream>
23
24// Local includes
25
26#include "matrixoperations.h"
27#include "vectoroperations.h"
28
29namespace Digikam
30{
31
33{
34public:
35
37 PointTransformAffine(const std::vector<std::vector<float> >& m_,
38 const std::vector<float>& b_);
39 explicit PointTransformAffine(const std::vector<std::vector<float> >& m_);
40
41 const std::vector<float> operator() (const std::vector<float>& p) const;
42
43 const std::vector<std::vector<float> >& get_m() const;
44 const std::vector<float>& get_b() const;
45
46private:
47
48 std::vector<std::vector<float> > m;
49 std::vector<float> b;
50};
51
52// ----------------------------------------------------------------------------------------
53
55 const PointTransformAffine& rhs);
56
57// ----------------------------------------------------------------------------------------
58
60
61// ----------------------------------------------------------------------------------------
62
63template <typename T>
64PointTransformAffine findAffineTransform(const std::vector<std::vector<T> >& fromPoints,
65 const std::vector<std::vector<T> >& toPoints)
66{
67 std::vector<std::vector<float> > P(3, std::vector<float>(fromPoints.size()));
68 std::vector<std::vector<float> > Q(2, std::vector<float>(fromPoints.size()));
69
70 for (unsigned long i = 0 ; i < fromPoints.size() ; ++i)
71 {
72 P[0][i] = fromPoints[i][0];
73 P[1][i] = fromPoints[i][1];
74 P[2][i] = 1;
75
76 Q[0][i] = toPoints[i][0];
77 Q[1][i] = toPoints[i][1];
78 }
79
80 const std::vector<std::vector<float> > m = Q * MatrixOperations::pinv(P);
81
82 return PointTransformAffine(m);
83}
84
85// ----------------------------------------------------------------------------------------
86
87PointTransformAffine findSimilarityTransform(const std::vector<std::vector<float> >& fromPoints,
88 const std::vector<std::vector<float> >& toPoints);
89
90} // namespace Digikam
Definition pointtransformaffine.h:33
const std::vector< float > & get_b() const
Definition pointtransformaffine.cpp:69
PointTransformAffine()
Definition pointtransformaffine.cpp:23
const std::vector< std::vector< float > > & get_m() const
Definition pointtransformaffine.cpp:64
const std::vector< float > operator()(const std::vector< float > &p) const
Definition pointtransformaffine.cpp:59
std::vector< std::vector< float > > pinv(const std::vector< std::vector< float > > &mat)
Definition matrixoperations.cpp:49
Definition datefolderview.cpp:34
PointTransformAffine inv(const PointTransformAffine &trans)
Definition pointtransformaffine.cpp:85
PointTransformAffine operator*(const PointTransformAffine &lhs, const PointTransformAffine &rhs)
Definition pointtransformaffine.cpp:76
PointTransformAffine findSimilarityTransform(const std::vector< std::vector< float > > &fromPoints, const std::vector< std::vector< float > > &toPoints)
Definition pointtransformaffine.cpp:94
PointTransformAffine findAffineTransform(const std::vector< std::vector< T > > &fromPoints, const std::vector< std::vector< T > > &toPoints)
Definition pointtransformaffine.h:64