MVE - Multi-View Environment mve-devel
Loading...
Searching...
No Matches
global_view_selection.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015, Ronny Klowsky, Simon Fuhrmann
3 * TU Darmstadt - Graphics, Capture and Massively Parallel Computing
4 * All rights reserved.
5 *
6 * This software may be modified and distributed under the terms
7 * of the BSD 3-Clause license. See the LICENSE.txt file for details.
8 */
9
10#include "math/vector.h"
12#include "dmrecon/mvs_tools.h"
13#include "dmrecon/settings.h"
14
16
17GlobalViewSelection::GlobalViewSelection(
18 std::vector<SingleView::Ptr> const& views,
19 mve::Bundle::Features const& features,
20 Settings const& settings)
21 : ViewSelection(settings)
22 , views(views)
23 , features(features)
24{
25 available.clear();
26 available.resize(views.size(), true);
28 for (std::size_t i = 0; i < views.size(); ++i)
29 if (views[i] == nullptr)
30 available[i] = false;
31}
32
33void
35{
36 selected.clear();
37 bool foundOne = true;
38 while (foundOne && (selected.size() < settings.globalVSMax))
39 {
40 float maxBenefit = 0.f;
41 std::size_t maxView = 0;
42 foundOne = false;
43 for (std::size_t i = 0; i < views.size(); ++i)
44 {
45 if (!available[i])
46 continue;
47
48 float benefit = benefitFromView(i);
49 if (benefit > maxBenefit) {
50 maxBenefit = benefit;
51 maxView = i;
52 foundOne = true;
53 }
54 }
55 if (foundOne) {
56 selected.insert(maxView);
57 available[maxView] = false;
58 }
59 }
60}
61
62float
63GlobalViewSelection::benefitFromView(std::size_t i)
64{
66 SingleView::Ptr tmpV = views[i];
67
68 std::vector<std::size_t> nFeatIDs = tmpV->getFeatureIndices();
69
70 // Go over all features visible in view i and reference view
71 float benefit = 0;
72 for (std::size_t k = 0; k < nFeatIDs.size(); ++k) {
73 float score = 1.f;
74 // Parallax with reference view
75 math::Vec3f ftPos(features[nFeatIDs[k]].pos);
76 float plx = parallax(ftPos, refV, tmpV);
77 if (plx < settings.minParallax)
78 score *= sqr(plx / 10.f);
79 // Resolution compared to reference view
80 float mfp = refV->footPrintScaled(ftPos);
81 float nfp = tmpV->footPrint(ftPos);
82 float ratio = mfp / nfp;
83 if (ratio > 2.)
84 ratio = 2. / ratio;
85 else if (ratio > 1.)
86 ratio = 1.;
87 score *= ratio;
88 // Parallax with other selected views that see the same feature
89 IndexSet::const_iterator citV;
90 for (citV = selected.begin(); citV != selected.end(); ++citV) {
91 if (!views[*citV]->seesFeature(nFeatIDs[k])) {
92 continue;
93 }
94 plx = parallax(ftPos, views[*citV], tmpV);
95 if (plx < settings.minParallax)
96 score *= sqr(plx / 10.f);
97 }
98 benefit += score;
99 }
100 return benefit;
101}
102
103
Vector class for arbitrary dimensions and types.
Definition vector.h:87
std::vector< Feature3D > Features
Definition bundle.h:62
std::shared_ptr< SingleView > Ptr
Definition single_view.h:31
Settings const & settings
std::vector< bool > available
#define MVS_NAMESPACE_BEGIN
Definition defines.h:18
#define MVS_NAMESPACE_END
Definition defines.h:19
float parallax(math::Vec3f p, mvs::SingleView::Ptr v1, mvs::SingleView::Ptr v2)
Computes the parallax between two views with respect to some 3D point p.
Definition mvs_tools.h:46
const T sqr(const T &a)
Definition defines.h:31
unsigned int globalVSMax
Definition settings.h:38
std::size_t refViewNr
The reference view ID to reconstruct.
Definition settings.h:25
float minParallax
Definition settings.h:33