image_utilities.cpp
Go to the documentation of this file.
1 // Do not change the order of this block. Otherwise getBinaryData with CV::mat overload will not be recognized
4 
6 
9 
13 
14 #include <string>
15 #include <utility>
16 #include <vector>
17 
18 std::string imageEncoding(bool isFloat, int channels, int bytesPerElement)
19 {
20  if (isFloat)
21  {
22  switch (channels)
23  {
24  case 1:
25  return (bytesPerElement == 4) ? sensor_msgs::image_encodings::TYPE_32FC1 :
27  case 2:
28  return (bytesPerElement == 4) ? sensor_msgs::image_encodings::TYPE_32FC2 :
30  case 3:
31  return (bytesPerElement == 4) ? sensor_msgs::image_encodings::TYPE_32FC3 :
33  case 4:
34  return (bytesPerElement == 4) ? sensor_msgs::image_encodings::TYPE_32FC4 :
36  }
37  }
38  else
39  {
40  switch (channels)
41  {
42  case 1:
43  switch (bytesPerElement)
44  {
45  case 1:
47  case 2:
49  case 4:
51  }
52  break;
53  case 2:
54  switch (bytesPerElement)
55  {
56  case 1:
58  case 2:
60  case 4:
62  }
63  break;
64  case 3:
65  switch (bytesPerElement)
66  {
67  case 1:
69  case 2:
71  case 4:
73  }
74  break;
75  case 4:
76  switch (bytesPerElement)
77  {
78  case 1:
80  case 2:
82  case 4:
84  }
85  break;
86  }
87  }
88 
89  ENSENSO_ERROR("Invalid image encoding in binary NxLib node.");
90  return "";
91 }
92 
93 ImagePtr imageFromNxLibNode(NxLibItem const& node, std::string const& frame, bool isFileCamera)
94 {
95  auto image = ensenso::std::make_shared<Image>();
96 
97  bool isFloat;
98  int width, height, channels, bytesPerElement;
99  double nxLibTimestamp;
100  node.getBinaryDataInfo(&width, &height, &channels, &bytesPerElement, &isFloat, &nxLibTimestamp);
101 
102  double timestamp = ensenso_conversion::nxLibToRosTimestamp(nxLibTimestamp, isFileCamera);
103 
104  image->header.stamp = ensenso::ros::timeFromSeconds(timestamp);
105  image->header.frame_id = frame;
106  image->width = width;
107  image->height = height;
108  image->step = width * channels * bytesPerElement;
109  image->encoding = imageEncoding(isFloat, channels, bytesPerElement);
110 
111  node.getBinaryData(image->data, 0);
112 
113  return image;
114 }
115 
116 ImagePtrPair imagePairFromNxLibNode(NxLibItem const& node, std::string const& frame, bool isFileCamera)
117 {
118  ImagePtr leftImage;
119  ImagePtr rightImage;
120 
121  if (node[itmLeft].exists() && node[itmRight].exists())
122  {
123  leftImage = imageFromNxLibNode(node[itmLeft], frame, isFileCamera);
124  rightImage = imageFromNxLibNode(node[itmRight], frame, isFileCamera);
125  }
126  else
127  {
128  // Create a dummy pair with an empty right image in case of an S-series camera.
129  leftImage = imageFromNxLibNode(node, frame, isFileCamera);
130  rightImage = nullptr;
131  }
132 
133  return { leftImage, rightImage };
134 }
135 
136 std::vector<ImagePtrPair> imagePairsFromNxLibNode(NxLibItem const& node, std::string const& frame, bool isFileCamera)
137 {
138  std::vector<ImagePtrPair> result;
139 
140  if (node.isArray())
141  {
142  for (int i = 0; i < node.count(); i++)
143  {
144  result.push_back(imagePairFromNxLibNode(node[i], frame, isFileCamera));
145  }
146  }
147  else
148  {
149  result.push_back(imagePairFromNxLibNode(node, frame, isFileCamera));
150  }
151 
152  return result;
153 }
154 
155 std::vector<ImagePtr> imagesFromNxLibNode(NxLibItem const& node, std::string const& frame, bool isFileCamera)
156 {
157  std::vector<ImagePtr> result;
158 
159  if (node.isArray())
160  {
161  for (int i = 0; i < node.count(); i++)
162  {
163  result.push_back(imageFromNxLibNode(node[i], frame, isFileCamera));
164  }
165  }
166  else
167  {
168  result.push_back(imageFromNxLibNode(node, frame, isFileCamera));
169  }
170 
171  return result;
172 }
173 
175 {
176  double nxLibTimestamp;
177  node.getBinaryDataInfo(0, 0, 0, 0, 0, &nxLibTimestamp);
178 
180 }
181 
182 ImagePtr depthImageFromNxLibNode(NxLibItem const& node, std::string const& frame, bool isFileCamera)
183 {
184  double nxLibTimestamp;
185  cv::Mat pointMap;
186  node.getBinaryData(pointMap, &nxLibTimestamp);
187 
188  cv::Mat depthImage;
189  cv::extractChannel(pointMap, depthImage, 2);
190 
191  // Convert units from millimeters to meters.
192  depthImage /= 1000.0;
193 
194  double timestamp = ensenso_conversion::nxLibToRosTimestamp(nxLibTimestamp, isFileCamera);
195 
196  // Convert cv mat to ros image.
197  cv_bridge::CvImage out_msg;
198  out_msg.header.stamp = ensenso::ros::timeFromSeconds(timestamp);
199  out_msg.header.frame_id = frame;
201  out_msg.image = depthImage;
202 
203  return out_msg.toImageMsg();
204 }
205 
206 void fillDistortionParamsFromNxLib(NxLibItem const& distortionItem, sensor_msgs::msg::CameraInfoPtr const& info)
207 {
208  std::vector<double> distParams(5, 0.);
209 
210  auto getNxLibValue = [](NxLibItem const& itemToCheck) -> double {
211  double value = 0.;
212  try
213  {
214  value = itemToCheck.asDouble();
215  }
216  catch (...)
217  {
218  ENSENSO_WARN("The distortion parameter %s does not exist. Using value 0.0 instead.", itemToCheck.path.c_str());
219  }
220  return value;
221  };
222 
223  if (distortionItem.isObject())
224  {
225  distParams[0] = getNxLibValue(distortionItem[itmK1]);
226  distParams[1] = getNxLibValue(distortionItem[itmK2]);
227  distParams[2] = getNxLibValue(distortionItem[itmT1]);
228  distParams[3] = getNxLibValue(distortionItem[itmT2]);
229  distParams[4] = getNxLibValue(distortionItem[itmK3]);
230  }
231  else if (distortionItem.isArray())
232  {
233  for (int i = 0; i < 5; i++)
234  {
235  distParams[i] = getNxLibValue(distortionItem[i]);
236  }
237  }
238 
239  GET_D_MATRIX(info) = distParams;
240 }
ENSENSO_WARN
void ENSENSO_WARN(T... args)
Definition: logging.h:210
cv_bridge.h
exists
ROSCPP_DECL bool exists(const std::string &service_name, bool print_failure_reason)
ensenso::ros::timeFromSeconds
inline ::ros::Time timeFromSeconds(double t)
Definition: time.h:87
cv_bridge::CvImage::toImageMsg
sensor_msgs::ImagePtr toImageMsg() const
distortion_models.h
imagePairFromNxLibNode
ImagePtrPair imagePairFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:116
sensor_msgs::image_encodings::TYPE_16UC4
const std::string TYPE_16UC4
ImagePtrPair
std::pair< ImagePtr, ImagePtr > ImagePtrPair
Definition: image_utilities.h:17
sensor_msgs::image_encodings::TYPE_8UC4
const std::string TYPE_8UC4
sensor_msgs::image_encodings::TYPE_64FC3
const std::string TYPE_64FC3
sensor_msgs::image_encodings::RGB8
const std::string RGB8
imagesFromNxLibNode
std::vector< ImagePtr > imagesFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:155
imageEncoding
std::string imageEncoding(bool isFloat, int channels, int bytesPerElement)
Definition: image_utilities.cpp:18
timestampFromNxLibNode
ensenso::ros::Time timestampFromNxLibNode(NxLibItem const &node)
Definition: image_utilities.cpp:174
imagePairsFromNxLibNode
std::vector< ImagePtrPair > imagePairsFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:136
sensor_msgs::image_encodings::TYPE_32FC4
const std::string TYPE_32FC4
ImagePtr
sensor_msgs::msg::ImagePtr ImagePtr
Definition: image_utilities.h:16
GET_D_MATRIX
#define GET_D_MATRIX(info)
Definition: namespace.h:54
cv_bridge::CvImage::header
std_msgs::Header header
imageFromNxLibNode
ImagePtr imageFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:93
sensor_msgs::image_encodings::TYPE_32SC2
const std::string TYPE_32SC2
ensenso::ros::Time
::ros::Time Time
Definition: time.h:67
sensor_msgs::image_encodings::TYPE_32SC3
const std::string TYPE_32SC3
fillDistortionParamsFromNxLib
void fillDistortionParamsFromNxLib(NxLibItem const &distortionItem, sensor_msgs::msg::CameraInfoPtr const &info)
Definition: image_utilities.cpp:206
conversion.h
sensor_msgs::image_encodings::TYPE_32SC4
const std::string TYPE_32SC4
sensor_msgs::image_encodings::TYPE_32FC2
const std::string TYPE_32FC2
sensor_msgs::image_encodings::TYPE_32FC3
const std::string TYPE_32FC3
sensor_msgs::image_encodings::TYPE_32SC1
const std::string TYPE_32SC1
cv_bridge::CvImage::encoding
std::string encoding
sensor_msgs::image_encodings::TYPE_32FC1
const std::string TYPE_32FC1
depthImageFromNxLibNode
ImagePtr depthImageFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:182
sensor_msgs::image_encodings::MONO8
const std::string MONO8
sensor_msgs::image_encodings::TYPE_8UC2
const std::string TYPE_8UC2
logging.h
sensor_msgs::image_encodings::MONO16
const std::string MONO16
image_encodings.h
core.h
cv_bridge::CvImage
sensor_msgs::image_encodings::TYPE_16UC2
const std::string TYPE_16UC2
sensor_msgs::image_encodings::TYPE_64FC4
const std::string TYPE_64FC4
sensor_msgs::image_encodings::TYPE_16UC3
const std::string TYPE_16UC3
ENSENSO_ERROR
void ENSENSO_ERROR(T... args)
Definition: logging.h:278
camera_info.h
sensor_msgs::image_encodings::TYPE_64FC1
const std::string TYPE_64FC1
image_utilities.h
cv_bridge::CvImage::image
cv::Mat image
ensenso_conversion::nxLibToRosTimestamp
double nxLibToRosTimestamp(double const &timestamp, bool isFileCamera=false)
Definition: conversion.cpp:40
sensor_msgs::image_encodings::TYPE_64FC2
const std::string TYPE_64FC2


ensenso_camera
Author(s): Ensenso
autogenerated on Wed Apr 2 2025 02:37:46