ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
colormaps.cc
Go to the documentation of this file.
1 // Copyright (c) 2018, ETH Zurich and UNC Chapel Hill.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 //
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 //
14 // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
15 // its contributors may be used to endorse or promote products derived
16 // from this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 // POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
31 
32 #include "ui/colormaps.h"
33 
34 #include "util/bitmap.h"
35 
36 namespace colmap {
37 
39  : scale(1.0f),
40  min(0.0f),
41  max(0.0f),
42  range(0.0f),
43  min_q(0.0f),
44  max_q(1.0f) {}
45 
46 void PointColormapBase::UpdateScale(std::vector<float>* values) {
47  if (values->empty()) {
48  min = 0.0f;
49  max = 0.0f;
50  range = 0.0f;
51  } else {
52  std::sort(values->begin(), values->end());
53  min = (*values)[static_cast<size_t>(min_q * (values->size() - 1))];
54  max = (*values)[static_cast<size_t>(max_q * (values->size() - 1))];
55  range = max - min;
56  }
57 }
58 
59 float PointColormapBase::AdjustScale(const float gray) {
60  if (range == 0.0f) {
61  return 0.0f;
62  } else {
63  const float gray_clipped = std::min(std::max(gray, min), max);
64  const float gray_scaled = (gray_clipped - min) / range;
65  return std::pow(gray_scaled, scale);
66  }
67 }
68 
69 void PointColormapPhotometric::Prepare(std::unordered_map<camera_t, Camera> &
70  cameras,
71  std::unordered_map<image_t, Image> & images,
72  std::unordered_map<point3D_t, Point3D> &
73  points3D,
74  std::vector<image_t>& reg_image_ids) {}
75 
77  const point3D_t point3D_id, const Point3D& point3D) {
78  return Eigen::Vector4f(point3D.Color(0) / 255.0f, point3D.Color(1) / 255.0f,
79  point3D.Color(2) / 255.0f, 1.0f);
80 }
81 
82 void PointColormapError::Prepare(std::unordered_map<camera_t, Camera> & cameras,
83  std::unordered_map<image_t, Image> & images,
84  std::unordered_map<point3D_t, Point3D> & points3D,
85  std::vector<image_t>& reg_image_ids) {
86  std::vector<float> errors;
87  errors.reserve(points3D.size());
88 
89  for (const auto& point3D : points3D) {
90  errors.push_back(static_cast<float>(point3D.second.Error()));
91  }
92 
93  UpdateScale(&errors);
94 }
95 
96 Eigen::Vector4f PointColormapError::ComputeColor(const point3D_t point3D_id,
97  const Point3D& point3D) {
98  const float gray = AdjustScale(static_cast<float>(point3D.Error()));
99  return Eigen::Vector4f(JetColormap::Red(gray), JetColormap::Green(gray),
100  JetColormap::Blue(gray), 1.0f);
101 }
102 
103 void PointColormapTrackLen::Prepare(std::unordered_map<camera_t, Camera> & cameras,
104  std::unordered_map<image_t, Image> & images,
105  std::unordered_map<point3D_t, Point3D> &
106  points3D,
107  std::vector<image_t>& reg_image_ids) {
108  std::vector<float> track_lengths;
109  track_lengths.reserve(points3D.size());
110 
111  for (const auto& point3D : points3D) {
112  track_lengths.push_back(point3D.second.Track().Length());
113  }
114 
115  UpdateScale(&track_lengths);
116 }
117 
118 Eigen::Vector4f PointColormapTrackLen::ComputeColor(const point3D_t point3D_id,
119  const Point3D& point3D) {
120  const float gray = AdjustScale(point3D.Track().Length());
121  return Eigen::Vector4f(JetColormap::Red(gray), JetColormap::Green(gray),
122  JetColormap::Blue(gray), 1.0f);
123 }
124 
126  std::unordered_map<camera_t, Camera> & cameras,
127  std::unordered_map<image_t, Image> & images,
128  std::unordered_map<point3D_t, Point3D> & points3D,
129  std::vector<image_t>& reg_image_ids) {
130  std::vector<float> resolutions;
131  resolutions.reserve(points3D.size());
132 
133  std::unordered_map<camera_t, float> focal_lengths;
134  std::unordered_map<camera_t, Eigen::Vector2f> principal_points;
135  for (const auto& camera : cameras) {
136  focal_lengths[camera.first] =
137  static_cast<float>(camera.second.MeanFocalLength());
138  principal_points[camera.first] =
139  Eigen::Vector2f(static_cast<float>(camera.second.PrincipalPointX()),
140  static_cast<float>(camera.second.PrincipalPointY()));
141  }
142 
143  std::unordered_map<image_t, Eigen::Vector3f> proj_centers;
144  for (const auto& image : images) {
145  proj_centers[image.first] = image.second.ProjectionCenter().cast<float>();
146  }
147 
148  for (const auto& point3D : points3D) {
149  float min_resolution = std::numeric_limits<float>::max();
150 
151  const Eigen::Vector3f xyz = point3D.second.XYZ().cast<float>();
152 
153  for (const auto track_el : point3D.second.Track().Elements()) {
154  const auto& image = images[track_el.image_id];
155  const float focal_length = focal_lengths[image.CameraId()];
156  const float focal_length2 = focal_length * focal_length;
157  const Eigen::Vector2f& pp = principal_points[image.CameraId()];
158 
159  const Eigen::Vector2f xy =
160  image.Point2D(track_el.point2D_idx).XY().cast<float>() - pp;
161 
162  // Distance from principal point to observation on image plane.
163  const float pixel_radius1 = xy.norm();
164 
165  const float x1 = xy(0) + (xy(0) < 0 ? -1.0f : 1.0f);
166  const float y1 = xy(1) + (xy(1) < 0 ? -1.0f : 1.0f);
167  const float pixel_radius2 = std::sqrt(x1 * x1 + y1 * y1);
168 
169  // Distance from camera center to observation on image plane.
170  const float pixel_dist1 =
171  std::sqrt(pixel_radius1 * pixel_radius1 + focal_length2);
172  const float pixel_dist2 =
173  std::sqrt(pixel_radius2 * pixel_radius2 + focal_length2);
174 
175  // Distance from 3D point to camera center.
176  const float dist = (xyz - proj_centers[track_el.image_id]).norm();
177 
178  // Perpendicular distance from 3D point to principal axis
179  const float r1 = pixel_radius1 * dist / pixel_dist1;
180  const float r2 = pixel_radius2 * dist / pixel_dist2;
181  const float dr = r2 - r1;
182 
183  // Ground resolution of observation, use "minus" to highlight
184  // high resolution.
185  const float resolution = -dr * dr;
186 
187  if (std::isfinite(resolution)) {
188  min_resolution = std::min(resolution, min_resolution);
189  }
190  }
191 
192  resolutions.push_back(min_resolution);
193  resolutions_[point3D.first] = min_resolution;
194  }
195 
196  UpdateScale(&resolutions);
197 }
198 
200  const point3D_t point3D_id, const Point3D& point3D) {
201  const float gray = AdjustScale(resolutions_[point3D_id]);
202  return Eigen::Vector4f(JetColormap::Red(gray), JetColormap::Green(gray),
203  JetColormap::Blue(gray), 1.0f);
204 }
205 
206 const Eigen::Vector4f ImageColormapBase::kDefaultPlaneColor = {1.0f, 0.1f, 0.0f,
207  0.6f};
208 const Eigen::Vector4f ImageColormapBase::kDefaultFrameColor = {0.8f, 0.1f, 0.0f,
209  1.0f};
210 
212 
213 void ImageColormapUniform::Prepare(std::unordered_map<camera_t, Camera> & cameras,
214  std::unordered_map<image_t, Image> & images,
215  std::unordered_map<point3D_t, Point3D> &
216  points3D,
217  std::vector<image_t>& reg_image_ids) {}
218 
220  Eigen::Vector4f* plane_color,
221  Eigen::Vector4f* frame_color) {
222  *plane_color = uniform_plane_color;
223  *frame_color = uniform_frame_color;
224 }
225 
226 void ImageColormapNameFilter::Prepare(std::unordered_map<camera_t, Camera> &
227  cameras,
228  std::unordered_map<image_t, Image> & images,
229  std::unordered_map<point3D_t, Point3D> &
230  points3D,
231  std::vector<image_t>& reg_image_ids) {}
232 
234  const std::string& word, const Eigen::Vector4f& plane_color,
235  const Eigen::Vector4f& frame_color) {
236  image_name_colors_.emplace_back(word,
237  std::make_pair(plane_color, frame_color));
238 }
239 
241  Eigen::Vector4f* plane_color,
242  Eigen::Vector4f* frame_color) {
243  for (const auto& image_name_color : image_name_colors_) {
244  if (StringContains(image.Name(), image_name_color.first)) {
245  *plane_color = image_name_color.second.first;
246  *frame_color = image_name_color.second.second;
247  return;
248  }
249  }
250 
251  *plane_color = kDefaultPlaneColor;
252  *frame_color = kDefaultFrameColor;
253 }
254 
255 } // namespace colmap
std::shared_ptr< core::Tensor > image
static const Eigen::Vector4f kDefaultPlaneColor
Definition: colormaps.h:109
static const Eigen::Vector4f kDefaultFrameColor
Definition: colormaps.h:110
void AddColorForWord(const std::string &word, const Eigen::Vector4f &plane_color, const Eigen::Vector4f &frame_color)
Definition: colormaps.cc:233
void ComputeColor(const Image &image, Eigen::Vector4f *plane_color, Eigen::Vector4f *frame_color) override
Definition: colormaps.cc:240
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > &reg_image_ids) override
Definition: colormaps.cc:226
Eigen::Vector4f uniform_frame_color
Definition: colormaps.h:126
Eigen::Vector4f uniform_plane_color
Definition: colormaps.h:125
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > &reg_image_ids) override
Definition: colormaps.cc:213
void ComputeColor(const Image &image, Eigen::Vector4f *plane_color, Eigen::Vector4f *frame_color) override
Definition: colormaps.cc:219
static float Red(const float gray)
Definition: bitmap.cc:655
static float Blue(const float gray)
Definition: bitmap.cc:659
static float Green(const float gray)
Definition: bitmap.cc:657
const class Track & Track() const
Definition: point3d.h:106
double Error() const
Definition: point3d.h:100
const Eigen::Vector3ub & Color() const
Definition: point3d.h:90
float AdjustScale(const float gray)
Definition: colormaps.cc:59
void UpdateScale(std::vector< float > *values)
Definition: colormaps.cc:46
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > &reg_image_ids) override
Definition: colormaps.cc:82
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
Definition: colormaps.cc:96
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > &reg_image_ids) override
Definition: colormaps.cc:125
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
Definition: colormaps.cc:199
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > &reg_image_ids) override
Definition: colormaps.cc:69
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
Definition: colormaps.cc:76
Eigen::Vector4f ComputeColor(const point3D_t point3D_id, const Point3D &point3D) override
Definition: colormaps.cc:118
void Prepare(std::unordered_map< camera_t, Camera > &cameras, std::unordered_map< image_t, Image > &images, std::unordered_map< point3D_t, Point3D > &points3D, std::vector< image_t > &reg_image_ids) override
Definition: colormaps.cc:103
size_t Length() const
Definition: track.h:82
CLOUDVIEWER_HOST_DEVICE Pair< First, Second > make_pair(const First &_first, const Second &_second)
Definition: SlabTraits.h:49
uint64_t point3D_t
Definition: types.h:72
bool StringContains(const std::string &str, const std::string &sub_str)
Definition: string.cc:201