colorizer.h
Go to the documentation of this file.
1 // License: Apache 2.0. See LICENSE file in root directory.
2 // Copyright(c) 2017 Intel Corporation. All Rights Reserved.
3 
4 #pragma once
5 
6 #include <map>
7 #include <vector>
8 
9 namespace rs2
10 {
11  class stream_profile;
12 }
13 
14 namespace librealsense {
15 
17  {
18  public:
19  color_map(std::map<float, float3> map, int steps = 4000) : _map(map)
20  {
21  initialize(steps);
22  }
23 
24  color_map(const std::vector<float3>& values, int steps = 4000)
25  {
26  for (size_t i = 0; i < values.size(); i++)
27  {
28  _map[(float)i / (values.size() - 1)] = values[i];
29  }
30  initialize(steps);
31  }
32 
33  color_map() {}
34 
35  inline float3 get(float value) const
36  {
37  if (_max == _min) return *_data;
38  auto t = (value - _min) / (_max - _min);
39  t = clamp_val(t, 0.f, 1.f);
40  return _data[(int)(t * (_size - 1))];
41  }
42 
43  float min_key() const { return _min; }
44  float max_key() const { return _max; }
45 
46  const std::vector<float3>& get_cache() const { return _cache; }
47 
48  private:
49  inline float3 lerp(const float3& a, const float3& b, float t) const
50  {
51  return b * t + a * (1 - t);
52  }
53 
54  float3 calc(float value) const
55  {
56  if (_map.size() == 0) return{ value, value, value };
57  // if we have exactly this value in the map, just return it
58  if (_map.find(value) != _map.end()) return _map.at(value);
59  // if we are beyond the limits, return the first/last element
60  if (value < _map.begin()->first) return _map.begin()->second;
61  if (value > _map.rbegin()->first) return _map.rbegin()->second;
62 
63  auto lower = _map.lower_bound(value) == _map.begin() ? _map.begin() : --(_map.lower_bound(value));
64  auto upper = _map.upper_bound(value);
65 
66  auto t = (value - lower->first) / (upper->first - lower->first);
67  auto c1 = lower->second;
68  auto c2 = upper->second;
69  return lerp(c1, c2, t);
70  }
71 
72  void initialize(int steps)
73  {
74  if (_map.size() == 0) return;
75 
76  _min = _map.begin()->first;
77  _max = _map.rbegin()->first;
78 
79  _cache.resize(steps + 1);
80  for (int i = 0; i <= steps; i++)
81  {
82  auto t = (float)i / steps;
83  auto x = _min + t*(_max - _min);
84  _cache[i] = calc(x);
85  }
86 
87  // Save size and data to avoid STL checks penalties in DEBUG
88  _size = _cache.size();
89  _data = _cache.data();
90  }
91 
92  std::map<float, float3> _map;
93  std::vector<float3> _cache;
94  float _min, _max;
95  size_t _size; float3* _data;
96  };
97 
99  {
100  public:
101  colorizer();
102 
103  template<typename T>
104  static void update_histogram(int* hist, const T* depth_data, int w, int h)
105  {
106  memset(hist, 0, MAX_DEPTH * sizeof(int));
107  for (auto i = 0; i < w*h; ++i)
108  {
109  T depth_val = depth_data[i];
110  int index = static_cast< int >( depth_val );
111  hist[index] += 1;
112  }
113 
114  for (auto i = 2; i < MAX_DEPTH; ++i) hist[i] += hist[i - 1]; // Build a cumulative histogram for the indices in [1,0xFFFF]
115  }
116 
117  static const int MAX_DEPTH = 0x10000;
118  static const int MAX_DISPARITY = 0x2710;
119 
120  protected:
121  colorizer(const char* name);
122 
123  bool should_process(const rs2::frame& frame) override;
124  rs2::frame process_frame(const rs2::frame_source& source, const rs2::frame& f) override;
125 
126  template<typename T, typename F>
127  void make_rgb_data(const T* depth_data, uint8_t* rgb_data, int width, int height, F coloring_func)
128  {
129  auto cm = _maps[_map_index];
130  for (auto i = 0; i < width*height; ++i)
131  {
132  auto d = depth_data[i];
133  colorize_pixel(rgb_data, i, cm, d, coloring_func);
134  }
135  }
136 
137  template<typename T, typename F>
138  void colorize_pixel(uint8_t* rgb_data, int idx, color_map* cm, T data, F coloring_func)
139  {
140  if (data)
141  {
142  auto f = coloring_func(data); // 0-255 based on histogram locationcolorize_pixel
143  auto c = cm->get(f);
144  rgb_data[idx * 3 + 0] = (uint8_t)c.x;
145  rgb_data[idx * 3 + 1] = (uint8_t)c.y;
146  rgb_data[idx * 3 + 2] = (uint8_t)c.z;
147  }
148  else
149  {
150  rgb_data[idx * 3 + 0] = 0;
151  rgb_data[idx * 3 + 1] = 0;
152  rgb_data[idx * 3 + 2] = 0;
153  }
154  }
155 
156  float _min, _max;
157  bool _equalize;
158 
159  std::vector<color_map*> _maps;
160  int _map_index = 0;
161 
162  std::vector<int> _histogram;
164 
165  int _preset = 0;
168 
169  float _depth_units = 0.f;
170  float _d2d_convert_factor = 0.f;
171  };
172 }
Catch::Generators::map
GeneratorWrapper< T > map(Func &&function, GeneratorWrapper< U > &&generator)
Definition: catch.hpp:4271
librealsense
Definition: calibration-model.h:9
librealsense::color_map::calc
float3 calc(float value) const
Definition: colorizer.h:54
uint8_t
unsigned char uint8_t
Definition: stdint.h:78
rs2::frame
Definition: rs_frame.hpp:345
librealsense::color_map::get
float3 get(float value) const
Definition: colorizer.h:35
rs2::frame_source
Definition: rs_processing.hpp:18
rs2::stream_profile
Definition: rs_frame.hpp:22
librealsense::color_map::color_map
color_map(const std::vector< float3 > &values, int steps=4000)
Definition: colorizer.h:24
librealsense::color_map::_min
float _min
Definition: colorizer.h:94
librealsense::clamp_val
T clamp_val(T val, const T &min, const T &max)
Definition: src/types.h:214
b
GLboolean GLboolean GLboolean b
Definition: glad/glad/glad.h:3064
rs2::lerp
float lerp(float a, float b, float t)
Definition: rendering.h:108
librealsense::colorizer::_maps
std::vector< color_map * > _maps
Definition: colorizer.h:159
data
Definition: parser.hpp:153
sw.h
int h
Definition: sw.py:17
LRS_EXTENSION_API
#define LRS_EXTENSION_API
Definition: basics.h:15
index
GLuint index
Definition: glad/glad/glad.h:2777
librealsense::color_map::initialize
void initialize(int steps)
Definition: colorizer.h:72
librealsense::colorizer::_histogram
std::vector< int > _histogram
Definition: colorizer.h:162
librealsense::color_map::_map
std::map< float, float3 > _map
Definition: colorizer.h:92
librealsense::color_map::max_key
float max_key() const
Definition: colorizer.h:44
example3 - opencv deploy.idx
idx
Definition: example3 - opencv deploy.py:49
librealsense::color_map::get_cache
const std::vector< float3 > & get_cache() const
Definition: colorizer.h:46
librealsense::stream_filter_processing_block
Definition: synthetic-stream.h:129
width
GLint GLsizei width
Definition: glad/glad/glad.h:1397
librealsense::colorizer::_source_stream_profile
rs2::stream_profile _source_stream_profile
Definition: colorizer.h:167
librealsense::float3
Definition: src/types.h:422
height
GLint GLsizei GLsizei height
Definition: glad/glad/glad.h:1397
librealsense::color_map::color_map
color_map()
Definition: colorizer.h:33
export_ply_example.colorizer
colorizer
Definition: export_ply_example.py:28
value
GLfloat value
Definition: glad/glad/glad.h:2099
f
GLdouble f
Definition: glad/glad/glad.h:1517
i
int i
Definition: rs-pcl-color.cpp:54
rs2
Definition: animated.h:9
w
GLdouble GLdouble GLdouble w
Definition: glad/glad/glad.h:1757
a
GLboolean GLboolean GLboolean GLboolean a
Definition: glad/glad/glad.h:3064
name
GLuint const GLchar * name
Definition: glad/glad/glad.h:2777
librealsense::colorizer::update_histogram
static void update_histogram(int *hist, const T *depth_data, int w, int h)
Definition: colorizer.h:104
librealsense::color_map::_size
size_t _size
Definition: colorizer.h:95
t265_stereo.T
T
Definition: t265_stereo.py:157
librealsense::colorizer::colorize_pixel
void colorize_pixel(uint8_t *rgb_data, int idx, color_map *cm, T data, F coloring_func)
Definition: colorizer.h:138
source
GLsizei GLsizei GLchar * source
Definition: glad/glad/glad.h:2828
librealsense::frame
Definition: frame.h:187
librealsense::colorizer
Definition: colorizer.h:98
realsense_device_manager.c
c
Definition: realsense_device_manager.py:330
librealsense::colorizer::make_rgb_data
void make_rgb_data(const T *depth_data, uint8_t *rgb_data, int width, int height, F coloring_func)
Definition: colorizer.h:127
librealsense::colorizer::_target_stream_profile
rs2::stream_profile _target_stream_profile
Definition: colorizer.h:166
t
GLdouble t
Definition: glad/glad/glad.h:1829
librealsense::color_map::lerp
float3 lerp(const float3 &a, const float3 &b, float t) const
Definition: colorizer.h:49
librealsense::colorizer::_min
float _min
Definition: colorizer.h:156
librealsense::colorizer::_equalize
bool _equalize
Definition: colorizer.h:157
x
GLdouble x
Definition: glad/glad/glad.h:2279
librealsense::color_map::min_key
float min_key() const
Definition: colorizer.h:43
librealsense::colorizer::_hist_data
int * _hist_data
Definition: colorizer.h:163
values
GLsizei const GLfloat * values
Definition: glad/glad/glad.h:2180
librealsense::color_map::_cache
std::vector< float3 > _cache
Definition: colorizer.h:93
librealsense::color_map::color_map
color_map(std::map< float, float3 > map, int steps=4000)
Definition: colorizer.h:19
rmse.d
d
Definition: rmse.py:171
librealsense::color_map
Definition: colorizer.h:16


librealsense2
Author(s): LibRealSense ROS Team
autogenerated on Thu Dec 22 2022 03:13:15