6 #ifndef IFM3D_FG_ORGANIZER_UTILS_H
7 #define IFM3D_FG_ORGANIZER_UTILS_H
9 #include <ifm3d/device/device.h>
10 #include <ifm3d/fg/buffer.h>
11 #include <ifm3d/fg/distance_image_info.h>
12 #include <ifm3d/fg/frame.h>
21 constexpr std::size_t IMG_BUFF_START = 8;
23 std::map<ImageChunk, std::set<std::size_t>> get_image_chunks(
24 const std::vector<std::uint8_t>& data,
25 std::size_t start_idx,
26 std::optional<size_t> end_idx = std::nullopt);
28 std::size_t get_format_size(PixelFormat fmt);
29 std::size_t get_format_channels(PixelFormat fmt);
31 Buffer create_1d_buffer(
const std::vector<std::uint8_t>& data,
34 Buffer create_buffer(
const std::vector<std::uint8_t>& data,
39 Buffer create_buffer(
const std::vector<std::uint8_t>& data,
44 const std::optional<json>& metadata = std::nullopt);
46 Buffer create_xyz_buffer(
const std::vector<std::uint8_t>& data,
53 const std::optional<Buffer>& mask);
55 auto find_metadata_chunk(
56 const std::map<ImageChunk, std::set<std::size_t>>& chunks)
57 -> decltype(chunks.end());
59 std::tuple<uint32_t, uint32_t> get_image_size(
60 const std::vector<std::uint8_t>& data,
63 PixelFormat get_chunk_format(
const std::vector<std::uint8_t>& data,
66 uint32_t get_chunk_frame_count(
const std::vector<std::uint8_t>& data,
69 std::vector<TimePointT> get_chunk_timestamps(
70 const std::vector<uint8_t>& data,
73 std::size_t get_chunk_pixeldata_offset(
const std::vector<std::uint8_t>& data,
76 std::size_t get_chunk_size(
const std::vector<std::uint8_t>& data,
79 std::size_t get_chunk_pixeldata_size(
const std::vector<std::uint8_t>& data,
82 std::size_t get_chunk_header_version(
const std::vector<std::uint8_t>& data,
85 void mask_buffer(Buffer& image,
const Buffer& mask);
87 bool is_probably_blob(
const std::vector<std::uint8_t>& data,
92 Buffer create_pixel_mask(Buffer& confidence);
95 const std::vector<uint8_t>& data,
96 const std::set<buffer_id>& requested_images,
97 const std::map<ifm3d::ImageChunk, std::set<std::size_t>>& chunks,
100 std::map<buffer_id, BufferList>& data_blob,
101 std::map<buffer_id, BufferList>& data_image);
104 std::map<ifm3d::buffer_id, ifm3d::BufferList>& images,
108 bool has_metadata(
const std::vector<std::uint8_t>& data, std::size_t idx);
110 ifm3d::json create_metadata(
const std::vector<std::uint8_t>& data,
112 buffer_id map_metadata_to_buffer_id(
const ifm3d::Buffer& buffer);
114 std::map<ifm3d::buffer_id, ifm3d::BufferList> map_logical_buffers(
115 const std::map<ifm3d::buffer_id, ifm3d::BufferList>& images,
116 const std::set<ifm3d::buffer_id>& requested_images);
130 template <
typename T>
132 mkval(
const unsigned char* buff)
137 unsigned char bytes[
sizeof(T)];
140 #if !defined(_WIN32) && __BYTE_ORDER == __BIG_ENDIAN
141 std::reverse_copy(buff, buff +
sizeof(T), value.bytes);
143 std::copy(buff, buff +
sizeof(T), value.bytes);
151 template <
typename T>
153 create_buffer_from_vector(
const std::vector<T>& vec)
158 ifm3d::FormatType<T>::NumChannels,
159 static_cast<ifm3d::PixelFormat
>(ifm3d::FormatType<T>::Format));
160 std::copy(vec.begin(), vec.end(), buf.begin<T>());
166 template <
typename T>
168 create_buffer_from_struct(
const T& struct_object)
170 ifm3d::Buffer buf = Buffer(
sizeof(T), 1, 1, ifm3d::PixelFormat::FORMAT_8U);
171 const auto* start =
reinterpret_cast<const uint8_t*
>(&struct_object);
172 auto* ptr = buf.
Ptr<uint8_t>(0);
173 std::copy(start, start +
sizeof(T), ptr);
179 template <
typename T>
184 const auto* ptr = buf.
Ptr<uint8_t>(0);
187 reinterpret_cast<uint8_t*
>(&struct_object));
188 return struct_object;
193 template <
typename T>
195 create_xyz_buffer(
const std::vector<std::uint8_t>& data,
201 ifm3d::PixelFormat fmt,
202 const std::optional<ifm3d::Buffer>& mask)
204 std::size_t
const incr =
sizeof(T);
205 std::size_t
const npts = width * height;
218 constexpr T bad_pixel = 0;
220 for (std::size_t i = 0; i < npts;
221 ++i, xidx += incr, yidx += incr, zidx += incr)
223 col =
static_cast<int>(i %
static_cast<size_t>(width));
228 xyz_ptr = im.Ptr<T>(row);
231 x = ifm3d::mkval<T>(data.data() + xidx);
232 y = ifm3d::mkval<T>(data.data() + yidx);
233 z = ifm3d::mkval<T>(data.data() + zidx);
235 if (mask.has_value() && mask.value().At<uint8_t>(row, col) != 0)
237 xyz_ptr[xyz_col] = bad_pixel;
238 xyz_ptr[xyz_col + 1] = bad_pixel;
239 xyz_ptr[xyz_col + 2] = bad_pixel;
243 xyz_ptr[xyz_col] = x;
244 xyz_ptr[xyz_col + 1] = y;
245 xyz_ptr[xyz_col + 2] = z;
The class Buffer represent a STL container to store data from the ifm devices in 2 dimension and supp...
Definition: buffer.h:99
T * Ptr(std::uint32_t row)
returns a pointer to the specified Buffer row.
BufferId
BufferIds available for use with the default Organizer.
Definition: buffer_id.h:19