70static cv::Mat
ImageToMat(
const com::robotraconteur::image::ImagePtr& image)
74 throw InvalidArgumentException(
"Image is null");
77 if (!image->image_info)
79 throw InvalidArgumentException(
"ImageInfo is null");
82 if (image->data->size() == 0)
84 throw InvalidArgumentException(
"Image data is empty");
87 size_t width = image->image_info->width;
88 size_t height = image->image_info->height;
89 size_t step = image->image_info->step;
91 if (width <= 0 || height <= 0)
93 throw InvalidArgumentException(
"Invalid image dimensions");
96 int32_t mat_type = -1;
97 switch (image->image_info->encoding)
99 case com::robotraconteur::image::ImageEncoding::rgb888: {
107 case com::robotraconteur::image::ImageEncoding::rgba8888: {
115 case com::robotraconteur::image::ImageEncoding::bgr888: {
123 case com::robotraconteur::image::ImageEncoding::bgra8888: {
131 case com::robotraconteur::image::ImageEncoding::mono8: {
139 case com::robotraconteur::image::ImageEncoding::mono16:
140 case com::robotraconteur::image::ImageEncoding::depth_u16: {
148 case com::robotraconteur::image::ImageEncoding::mono32:
149 case com::robotraconteur::image::ImageEncoding::depth_u32: {
157#if !defined(CV_VERSION_EPOCH) && CV_VERSION_MAJOR >= 4
158 case com::robotraconteur::image::ImageEncoding::mono_f16: {
167 case com::robotraconteur::image::ImageEncoding::depth_f32:
168 case com::robotraconteur::image::ImageEncoding::mono_f32: {
176 case com::robotraconteur::image::ImageEncoding::mono_f64:
177 case com::robotraconteur::image::ImageEncoding::depth_f64: {
186 throw InvalidArgumentException(
"Unsupported image encoding");
189 size_t expected_bytes = step * height;
190 if (expected_bytes != image->data->size())
192 throw InvalidArgumentException(
"Image data size does not match expected size");
195 cv::Mat mat(boost::numeric_cast<int>(height), boost::numeric_cast<int>(width), mat_type, image->data->data(), step);
197 switch (image->image_info->encoding)
199 case com::robotraconteur::image::ImageEncoding::rgb888:
200 cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR);
202 case com::robotraconteur::image::ImageEncoding::rgba8888:
203 cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGRA);
237 const cv::Mat& mat, com::robotraconteur::image::ImageEncoding::ImageEncoding encoding)
241 throw InvalidArgumentException(
"Mat is empty");
244 if (mat.channels() <= 0)
246 throw InvalidArgumentException(
"Invalid number of channels");
249 if (mat.step[0] <= 0)
251 throw InvalidArgumentException(
"Invalid step");
254 com::robotraconteur::image::ImagePtr image(
new com::robotraconteur::image::Image());
255 com::robotraconteur::image::ImageInfoPtr image_info(
new com::robotraconteur::image::ImageInfo());
256 image->image_info = image_info;
258 image_info->width = mat.cols;
259 image_info->height = mat.rows;
260 image_info->step = boost::numeric_cast<uint32_t>((
size_t)mat.step[0]);
261 image_info->encoding = encoding;
263 int32_t mat_type = -1;
264 size_t element_size = 0;
268 case com::robotraconteur::image::ImageEncoding::rgb888: {
272 case com::robotraconteur::image::ImageEncoding::rgba8888: {
276 case com::robotraconteur::image::ImageEncoding::bgr888: {
280 case com::robotraconteur::image::ImageEncoding::bgra8888: {
284 case com::robotraconteur::image::ImageEncoding::mono8: {
288 case com::robotraconteur::image::ImageEncoding::mono16:
289 case com::robotraconteur::image::ImageEncoding::depth_u16: {
293 case com::robotraconteur::image::ImageEncoding::mono32:
294 case com::robotraconteur::image::ImageEncoding::depth_u32: {
298#if !defined(CV_VERSION_EPOCH) && CV_VERSION_MAJOR >= 4
299 case com::robotraconteur::image::ImageEncoding::mono_f16: {
304 case com::robotraconteur::image::ImageEncoding::mono_f32:
305 case com::robotraconteur::image::ImageEncoding::depth_f32: {
309 case com::robotraconteur::image::ImageEncoding::mono_f64:
310 case com::robotraconteur::image::ImageEncoding::depth_f64: {
315 throw InvalidArgumentException(
"Unsupported image encoding");
318 if (mat.type() != mat_type)
320 throw InvalidArgumentException(
"Invalid image type passed for specified encoding");
322 RobotRaconteur::RRArrayPtr<uint8_t> rr_data =
323 RobotRaconteur::AllocateRRArray<uint8_t>(mat.total() * mat.elemSize());
324 cv::Mat rr_mat_target(mat.rows, mat.cols, mat_type, rr_data->data(), mat.step[0]);
327 case com::robotraconteur::image::ImageEncoding::rgb888:
328 cv::cvtColor(mat, rr_mat_target, cv::COLOR_BGR2RGB);
330 case com::robotraconteur::image::ImageEncoding::rgba8888:
331 cv::cvtColor(mat, rr_mat_target, cv::COLOR_BGRA2RGBA);
334 mat.copyTo(rr_mat_target);
337 image->data = rr_data;
static com::robotraconteur::image::ImagePtr MatToImage(const cv::Mat &mat, com::robotraconteur::image::ImageEncoding::ImageEncoding encoding)
Convert an OpenCV Mat to a Robot Raconteur standard image.
Definition ImageUtil.h:236