21#include "opencv2/core/mat.hpp"
23#include "sensor_msgs/msg/image.hpp"
24#include "std_msgs/msg/header.hpp"
36 if (encoding ==
"mono8") {
38 }
else if (encoding ==
"bgr8") {
40 }
else if (encoding ==
"mono16") {
42 }
else if (encoding ==
"rgba8") {
44 }
else if (encoding ==
"bgra8") {
46 }
else if (encoding ==
"32FC1") {
48 }
else if (encoding ==
"rgb8") {
50 }
else if (encoding ==
"yuv422") {
53 throw std::runtime_error(
"Unsupported encoding type");
60 NotNull(
const T * pointer_in,
const char * msg)
63 if (pointer ==
nullptr) {
64 throw std::invalid_argument(msg);
74 std::unique_ptr<sensor_msgs::msg::Image> unique_sensor_msgs_image)
76 unique_sensor_msgs_image.get(),
77 "unique_sensor_msgs_image cannot be nullptr"
80 unique_sensor_msgs_image->height,
81 unique_sensor_msgs_image->width,
83 unique_sensor_msgs_image->data.data(),
84 unique_sensor_msgs_image->step),
85 storage_(std::move(unique_sensor_msgs_image))
89 std::shared_ptr<sensor_msgs::msg::Image> shared_sensor_msgs_image)
90: header_(shared_sensor_msgs_image->header),
92 shared_sensor_msgs_image->height,
93 shared_sensor_msgs_image->width,
95 shared_sensor_msgs_image->data.data(),
96 shared_sensor_msgs_image->step),
97 storage_(shared_sensor_msgs_image)
101 const cv::Mat & mat_frame,
102 const std_msgs::msg::Header & header,
107 is_bigendian_(is_bigendian)
111 cv::Mat && mat_frame,
112 const std_msgs::msg::Header & header,
115 frame_(std::forward<cv::Mat>(mat_frame)),
117 is_bigendian_(is_bigendian)
121 const sensor_msgs::msg::Image & sensor_msgs_image)
128 return std::holds_alternative<std::nullptr_t>(
storage_);
143const std_msgs::msg::Header &
149std_msgs::msg::Header &
155std::shared_ptr<const sensor_msgs::msg::Image>
158 if (!std::holds_alternative<std::shared_ptr<sensor_msgs::msg::Image>>(
storage_)) {
161 return std::get<std::shared_ptr<sensor_msgs::msg::Image>>(
storage_);
164std::unique_ptr<sensor_msgs::msg::Image>
167 auto unique_image = std::make_unique<sensor_msgs::msg::Image>();
174 sensor_msgs::msg::Image & sensor_msgs_image)
const
176 sensor_msgs_image.height =
frame_.rows;
177 sensor_msgs_image.width =
frame_.cols;
180 sensor_msgs_image.encoding =
"mono8";
183 sensor_msgs_image.encoding =
"bgr8";
186 sensor_msgs_image.encoding =
"mono16";
189 sensor_msgs_image.encoding =
"rgba8";
192 throw std::runtime_error(
"unsupported encoding type");
194 sensor_msgs_image.step =
static_cast<sensor_msgs::msg::Image::_step_type
>(
frame_.step);
196 sensor_msgs_image.data.resize(size);
197 memcpy(&sensor_msgs_image.data[0],
frame_.data, size);
198 sensor_msgs_image.header =
header_;