ifm3d
organizer_utils.h
1 /*
2  * Copyright 2022-present ifm electronic, gmbh
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #ifndef IFM3D_FG_ORGANIZER_UTILS_H
7 #define IFM3D_FG_ORGANIZER_UTILS_H
8 
9 #include <map>
10 #include <set>
11 #include <optional>
12 #include <vector>
13 #include <tuple>
14 #include <set>
15 #include <ifm3d/device/device.h>
16 #include <ifm3d/fg/buffer.h>
17 #include <ifm3d/fg/frame.h>
18 #include <ifm3d/fg/distance_image_info.h>
19 
20 namespace ifm3d
21 {
22  constexpr std::size_t IMG_BUFF_START = 8;
23 
24  std::map<image_chunk, std::set<std::size_t>> get_image_chunks(
25  const std::vector<std::uint8_t>& data,
26  std::size_t start_idx,
27  std::optional<size_t> end_idx = std::nullopt);
28 
29  std::size_t get_format_size(pixel_format fmt);
30  std::size_t get_format_channels(pixel_format fmt);
31 
32  Buffer create_1d_buffer(const std::vector<std::uint8_t>& data,
33  std::size_t idx);
34 
35  Buffer create_buffer(const std::vector<std::uint8_t>& data,
36  std::size_t idx,
37  std::size_t width,
38  std::size_t height);
39 
40  Buffer create_buffer(const std::vector<std::uint8_t>& data,
41  std::size_t idx,
42  std::size_t width,
43  std::size_t height,
44  pixel_format fmt,
45  std::optional<json> metadata = std::nullopt);
46 
47  Buffer create_xyz_buffer(const std::vector<std::uint8_t>& data,
48  std::size_t xidx,
49  std::size_t yidx,
50  std::size_t zidx,
51  std::size_t width,
52  std::size_t height,
53  pixel_format fmt,
54  const std::optional<Buffer>& mask);
55 
56  auto find_metadata_chunk(
57  const std::map<image_chunk, std::set<std::size_t>>& chunks)
58  -> decltype(chunks.end());
59 
60  std::tuple<uint32_t, uint32_t> get_image_size(
61  const std::vector<std::uint8_t>& data,
62  std::size_t idx);
63 
64  pixel_format get_chunk_format(const std::vector<std::uint8_t>& data,
65  std::size_t idx);
66 
67  uint32_t get_chunk_frame_count(const std::vector<std::uint8_t>& data,
68  std::size_t idx);
69 
70  std::vector<TimePointT> get_chunk_timestamps(
71  const std::vector<uint8_t>& data,
72  std::size_t idx);
73 
74  std::size_t get_chunk_pixeldata_offset(const std::vector<std::uint8_t>& data,
75  std::size_t idx);
76 
77  std::size_t get_chunk_size(const std::vector<std::uint8_t>& data,
78  std::size_t idx);
79 
80  std::size_t get_chunk_pixeldata_size(const std::vector<std::uint8_t>& data,
81  std::size_t idx);
82 
83  std::size_t get_chunk_header_version(const std::vector<std::uint8_t>& data,
84  std::size_t idx);
85 
86  void mask_buffer(Buffer& image, const Buffer& mask);
87 
88  bool is_probably_blob(const std::vector<std::uint8_t>& data,
89  std::size_t idx,
90  std::size_t width,
91  std::size_t height);
92 
93  Buffer create_pixel_mask(Buffer& confidence);
94 
95  void parse_data(
96  const std::vector<uint8_t>& data,
97  const std::set<buffer_id>& requestedImages,
98  const std::map<ifm3d::image_chunk, std::set<std::size_t>>& chunks,
99  const size_t width,
100  const size_t height,
101  std::map<buffer_id, BufferList>& data_blob,
102  std::map<buffer_id, BufferList>& data_image);
103 
104  void mask_images(std::map<ifm3d::buffer_id, ifm3d::BufferList>& images,
105  ifm3d::Buffer& mask,
106  std::function<bool(ifm3d::buffer_id id)> should_mask);
107 
108  bool has_metadata(const std::vector<std::uint8_t>& data, std::size_t idx);
109 
110  ifm3d::json create_metadata(const std::vector<std::uint8_t>& data,
111  std::size_t idx);
112 
125  template <typename T>
126  T
127  mkval(const unsigned char* buff)
128  {
129  union
130  {
131  T v;
132  unsigned char bytes[sizeof(T)];
133  } value;
134 
135 #if !defined(_WIN32) && __BYTE_ORDER == __BIG_ENDIAN
136  std::reverse_copy(buff, buff + sizeof(T), value.bytes);
137 #else
138  std::copy(buff, buff + sizeof(T), value.bytes);
139 #endif
140 
141  return value.v;
142  }
146  template <typename T>
148  create_buffer_from_vector(const std::vector<T>& vec)
149  {
150  ifm3d::Buffer buf =
151  Buffer(vec.size(),
152  1,
153  ifm3d::FormatType<T>::nchannel,
154  static_cast<ifm3d::pixel_format>(ifm3d::FormatType<T>::format));
155  std::copy(vec.begin(), vec.end(), buf.begin<T>());
156  return buf;
157  }
161  template <typename T>
163  create_buffer_from_struct(const T& struct_object)
164  {
165  ifm3d::Buffer buf =
166  Buffer(sizeof(T), 1, 1, ifm3d::pixel_format::FORMAT_8U);
167  const uint8_t* start = reinterpret_cast<const uint8_t*>(&struct_object);
168  auto ptr = buf.ptr<uint8_t>(0);
169  std::copy(start, start + sizeof(T), ptr);
170  return buf;
171  }
175  template <typename T>
176  T
177  convert_buffer_to_struct(const ifm3d::Buffer& buf)
178  {
179  T struct_object;
180  auto ptr = buf.ptr<uint8_t>(0);
181  std::copy(ptr,
182  ptr + sizeof(T),
183  reinterpret_cast<uint8_t*>(&struct_object));
184  return struct_object;
185  }
186 
187 } // end: namespace ifm3d
188 
189 #endif // IFM3D_FG_ORGANIZER_UTILS_H
ifm3d::json
Definition: json.hpp:128
ifm3d::Buffer
The class Buffer represent a STL container to store data from the ifm devices in 2 dimension and supp...
Definition: buffer.h:98
ifm3d::buffer_id
buffer_id
Definition: frame.h:24
ifm3d::Buffer::ptr
T * ptr(const std::uint32_t row)
returns a pointer to the specified Buffer row.