1 // -*- c-basic-offset: 4 -*-
2 /** @file
3  *
4 * !! from PTOptimise.h 1951
5  *
6  *  functions to call the optimizer of panotools.
7  *
8  *  @author Pablo d'Angelo <pablo.dangelo@web.de>
9  *
10  *  $Id: PTOptimise.h 1951 2007-04-15 20:54:49Z dangelo $
11  *
12  *  This is free software; you can redistribute it and/or
13  *  modify it under the terms of the GNU General Public
14  *  License as published by the Free Software Foundation; either
15  *  version 2 of the License, or (at your option) any later version.
16  *
17  *  This software is distributed in the hope that it will be useful,
18  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  *  Lesser General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public
23  *  License along with this software. If not, see
24  *  <http://www.gnu.org/licenses/>.
25  *
26  */
27 
28 #ifndef _PTOPTIMIZER_H
29 #define _PTOPTIMIZER_H
30 
31 #include <algorithms/PanoramaAlgorithm.h>
32 
33 #include <hugin_shared.h>
34 #include <set>
35 #include <panodata/PanoramaData.h>
36 #include <panotools/PanoToolsOptimizerWrapper.h>
37 
38 namespace HuginBase {
39 
40 
41     ///
42     class IMPEX PTOptimizer : public PanoramaAlgorithm
43     {
44 
45         public:
46             ///
PTOptimizer(PanoramaData & panorama)47             explicit PTOptimizer(PanoramaData& panorama)
48              : PanoramaAlgorithm(panorama)
49             {};
50 
51             ///
~PTOptimizer()52             virtual ~PTOptimizer()
53             {}
54 
55 
56         public:
57             ///
modifiesPanoramaData()58             virtual bool modifiesPanoramaData() const
59                 { return true; }
60 
61             /// calls PTools::optimize()
62             virtual bool runAlgorithm();
63     };
64 
65     /// Pairwise ransac optimisation
66     class IMPEX RANSACOptimizer : public PanoramaAlgorithm
67     {
68         public:
69 	    enum Mode {AUTO, HOMOGRAPHY, RPY, RPYV, RPYVB};
70 
71             ///
72             RANSACOptimizer(PanoramaData& panorama, int i1, int i2, double maxError, Mode mode=RPY)
PanoramaAlgorithm(panorama)73 		: PanoramaAlgorithm(panorama), o_i1(i1), o_i2(i2),
74 	          o_maxError(maxError), o_mode(mode)
75             {};
76 
77             ///
~RANSACOptimizer()78             virtual ~RANSACOptimizer()
79             {}
80 
81 
82         public:
83             ///
modifiesPanoramaData()84             virtual bool modifiesPanoramaData() const
85                 { return true; }
86 
87 	    static std::vector<int> findInliers(PanoramaData & pano, int i1, int i2, double maxError,
88 						Mode mode=RPY);
89 
90             /// calls PTools::optimize()
91             virtual bool runAlgorithm();
92 
93         private:
94 	    int o_i1, o_i2;
95 	    double o_maxError;
96 	    std::vector<int> o_inliers;
97 	    Mode o_mode;
98     };
99 
100 
101     ///
102     class IMPEX AutoOptimise : public PTOptimizer
103     {
104 
105         public:
106             ///
107             AutoOptimise(PanoramaData& panorama, bool optRoll=true)
PTOptimizer(panorama)108              : PTOptimizer(panorama)
109             {};
110 
111             ///
~AutoOptimise()112             virtual ~AutoOptimise()
113             {}
114 
115 
116         public:
117             ///
118             static void autoOptimise(PanoramaData& pano, bool optRoll=true);
119 
120         public:
121             ///
runAlgorithm()122             virtual bool runAlgorithm()
123             {
124                 autoOptimise(o_panorama);
125                 return true; // let's hope so.
126             }
127 
128     };
129 
130     ///
131     class IMPEX SmartOptimizerStub
132     {
133         public:
134             ///
135             enum OptMode {
136                 OPT_POS=1,
137                 OPT_B=2,
138                 OPT_AC=4,
139                 OPT_DE=8,
140                 OPT_HFOV=16,
141                 OPT_GT=32,
142                 OPT_VIG=64,
143                 OPT_VIGCENTRE=128,
144                 OPT_EXP=256,
145                 OPT_WB=512,
146                 OPT_RESP=1024
147             };
148 
149             /// helper function for optvar creation
150             static OptimizeVector createOptVars(const PanoramaData& optPano, int mode, unsigned anchorImg=0);
151     };
152 
153     class IMPEX SmartOptimise : public PTOptimizer, protected SmartOptimizerStub
154     {
155 
156         public:
157             ///
SmartOptimise(PanoramaData & panorama)158             explicit SmartOptimise(PanoramaData& panorama)
159              : PTOptimizer(panorama)
160             {};
161 
162             ///
~SmartOptimise()163             virtual ~SmartOptimise()
164             {}
165 
166         public:
167             ///
168             static void smartOptimize(PanoramaData& pano);
169 
170 
171         public:
172             ///
runAlgorithm()173             virtual bool runAlgorithm()
174             {
175                 smartOptimize(o_panorama);
176                 return true; // let's hope so.
177             }
178 
179     };
180 
181 }//namespace
182 
183 #endif //_h
184