MVE - Multi-View Environment mve-devel
Loading...
Searching...
No Matches
bundler_features.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015, 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 "util/timer.h"
11#include "mve/image.h"
12#include "mve/image_exif.h"
13#include "mve/image_tools.h"
14#include "sfm/bundler_common.h"
17
20
21void
22Features::compute (mve::Scene::Ptr scene, ViewportList* viewports)
23{
24 if (scene == nullptr)
25 throw std::invalid_argument("Null scene given");
26 if (viewports == nullptr)
27 throw std::invalid_argument("No viewports given");
28
29 mve::Scene::ViewList const& views = scene->get_views();
30
31 /* Initialize viewports. */
32 viewports->clear();
33 viewports->resize(views.size());
34
35 std::size_t num_views = viewports->size();
36 std::size_t num_done = 0;
37 std::size_t total_features = 0;
38
39 /* Iterate the scene and compute features. */
40#pragma omp parallel for schedule(dynamic,1)
41 for (std::size_t i = 0; i < views.size(); ++i)
42 {
43#pragma omp critical
44 {
45 num_done += 1;
46 float percent = (num_done * 1000 / num_views) / 10.0f;
47 std::cout << "\rDetecting features, view " << num_done << " of "
48 << num_views << " (" << percent << "%)..." << std::flush;
49 }
50
51 if (views[i] == nullptr)
52 continue;
53
54 mve::View::Ptr view = views[i];
55 mve::ByteImage::Ptr image = view->get_byte_image
56 (this->opts.image_embedding);
57 if (image == nullptr)
58 continue;
59
60 /* Rescale image until maximum image size is met. */
61 util::WallTimer timer;
62 while (this->opts.max_image_size > 0
63 && image->width() * image->height() > this->opts.max_image_size)
64 image = mve::image::rescale_half_size<uint8_t>(image);
65
66 /* Compute features for view. */
67 Viewport* viewport = &viewports->at(i);
68 viewport->features.set_options(this->opts.feature_options);
69 viewport->features.compute_features(image);
71 viewport->principal_point[0], viewport->principal_point[1]);
72
73#pragma omp critical
74 {
75 std::size_t const num_feats = viewport->features.positions.size();
76 std::cout << "\rView ID "
77 << util::string::get_filled(view->get_id(), 4, '0') << " ("
78 << image->width() << "x" << image->height() << "), "
79 << util::string::get_filled(num_feats, 5, ' ') << " features"
80 << ", took " << timer.get_elapsed() << " ms." << std::endl;
81 total_features += viewport->features.positions.size();
82 }
83
84 /* Clean up unused embeddings. */
85 image.reset();
86 view->cache_cleanup();
87 }
88
89 std::cout << "\rComputed " << total_features << " features "
90 << "for " << num_views << " views (average "
91 << (total_features / num_views) << ")." << std::endl;
92}
93
std::shared_ptr< Image< T > > Ptr
Definition image.h:42
std::shared_ptr< Scene > Ptr
Definition scene.h:37
std::vector< View::Ptr > ViewList
Definition scene.h:38
std::shared_ptr< View > Ptr
Definition view.h:68
std::vector< math::Vec2f > positions
Per-feature image position.
Definition feature_set.h:66
void compute_features(mve::ByteImage::Ptr image)
Computes the features specified in the options.
void set_options(Options const &options)
void normalize_feature_positions(float px, float py)
Normalizes the features positions w.r.t.
Cross-platform high-resolution real-time timer.
Definition timer.h:30
std::size_t get_elapsed(void) const
Returns the milli seconds since last reset.
Definition timer.h:94
std::vector< Viewport > ViewportList
The list of all viewports considered for bundling.
std::string get_filled(T const &value, int width, char fill='0')
Returns a string filled to the left to a length of 'width' chars.
Definition strings.h:142
#define SFM_BUNDLER_NAMESPACE_END
Definition defines.h:17
#define SFM_BUNDLER_NAMESPACE_BEGIN
Definition defines.h:16
#define SFM_NAMESPACE_END
Definition defines.h:14
#define SFM_NAMESPACE_BEGIN
Definition defines.h:13
Per-viewport information.
float principal_point[2]
Principal point parameter.
FeatureSet features
Per-feature information.