camera_utilities.h
Go to the documentation of this file.
1 
34 #ifndef MULTISENSE_ROS_CAMERA_UTILITIES_H
35 #define MULTISENSE_ROS_CAMERA_UTILITIES_H
36 
37 #include <tuple>
38 #include <mutex>
39 
40 #include <Eigen/Core>
41 #include <Eigen/Geometry>
42 
43 #include <opencv2/opencv.hpp>
44 
45 #include <ros/ros.h>
46 #include <sensor_msgs/CameraInfo.h>
47 
48 #include <multisense_lib/MultiSenseChannel.hh>
49 #include <multisense_lib/MultiSenseTypes.hh>
50 
51 namespace multisense_ros {
52 
53 static constexpr size_t S30_AUX_CAM_WIDTH = 1920;
54 static constexpr size_t S30_AUX_CAM_HEIGHT = 1188;
55 
57 {
58  size_t width = 0;
59  size_t height = 0;
60 };
61 
63 
65 {
66  cv::Mat map1;
67  cv::Mat map2;
68 };
69 
70 template <typename T>
72 {
73 public:
75  const T &data):
76  driver_(driver),
77  callback_buffer_(driver->reserveCallbackBuffer()),
78  data_(data)
79  {
80  }
81 
83  {
84  driver_->releaseCallbackBuffer(callback_buffer_);
85  }
86 
87  const T &data() const noexcept
88  {
89  return data_;
90  }
91 
92 private:
93 
94  BufferWrapper(const BufferWrapper&) = delete;
95  BufferWrapper operator=(const BufferWrapper&) = delete;
96 
99  const T data_;
100 
101 };
102 
103 template <typename T>
104 constexpr Eigen::Matrix<T, 3, 1> ycbcrToBgr(const crl::multisense::image::Header &luma,
105  const crl::multisense::image::Header &chroma,
106  size_t u,
107  size_t v)
108 {
109  const uint8_t *lumaP = reinterpret_cast<const uint8_t*>(luma.imageDataP);
110  const uint8_t *chromaP = reinterpret_cast<const uint8_t*>(chroma.imageDataP);
111 
112  const size_t luma_offset = (v * luma.width) + u;
113  const size_t chroma_offset = 2 * (((v/2) * (luma.width/2)) + (u/2));
114 
115  const float px_y = static_cast<float>(lumaP[luma_offset]);
116  const float px_cb = static_cast<float>(chromaP[chroma_offset+0]) - 128.0f;
117  const float px_cr = static_cast<float>(chromaP[chroma_offset+1]) - 128.0f;
118 
119  float px_r = px_y + 1.402f * px_cr;
120  float px_g = px_y - 0.34414f * px_cb - 0.71414f * px_cr;
121  float px_b = px_y + 1.772f * px_cb;
122 
123  if (px_r < 0.0f) px_r = 0.0f;
124  else if (px_r > 255.0f) px_r = 255.0f;
125  if (px_g < 0.0f) px_g = 0.0f;
126  else if (px_g > 255.0f) px_g = 255.0f;
127  if (px_b < 0.0f) px_b = 0.0f;
128  else if (px_b > 255.0f) px_b = 255.0f;
129 
130  return Eigen::Matrix<T, 3, 1>{static_cast<T>(px_b), static_cast<T>(px_g), static_cast<T>(px_r)};
131 }
132 
134  const crl::multisense::image::Header &chroma,
135  uint8_t *output);
136 
137 Eigen::Matrix4d makeQ(const crl::multisense::image::Config& config,
138  const crl::multisense::image::Calibration& calibration,
139  const crl::multisense::system::DeviceInfo& device_info);
140 
141 sensor_msgs::CameraInfo makeCameraInfo(const crl::multisense::image::Config& config,
143  const crl::multisense::system::DeviceInfo& device_info,
144  bool scale_calibration);
145 
148  const crl::multisense::system::DeviceInfo& device_info);
150 {
151 public:
152  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
153 
155  const crl::multisense::image::Calibration& calibration,
156  const crl::multisense::system::DeviceInfo& device_info);
157 
158  void updateConfig(const crl::multisense::image::Config& config);
159 
160  crl::multisense::image::Config config() const;
161 
166  Eigen::Matrix4d Q() const;
167 
172  double T() const;
173 
178  Eigen::Vector3d aux_T() const;
179 
183  Eigen::Vector3f reproject(size_t u, size_t v, double d) const;
184 
188  Eigen::Vector3f reproject(size_t u,
189  size_t v,
190  double d,
191  const sensor_msgs::CameraInfo &left_camera_info,
192  const sensor_msgs::CameraInfo &right_camera_info) const;
193 
198  Eigen::Vector2f rectifiedAuxProject(const Eigen::Vector3f &left_rectified_point) const;
199 
204  Eigen::Vector2f rectifiedAuxProject(const Eigen::Vector3f &left_rectified_point,
205  const sensor_msgs::CameraInfo &aux_camera_info) const;
206 
211  OperatingResolutionT operatingStereoResolution() const;
212 
217  OperatingResolutionT operatingAuxResolution() const;
218 
222  bool validRight() const;
223 
227  bool validAux() const;
228 
229  sensor_msgs::CameraInfo leftCameraInfo(const std::string& frame_id, const ros::Time& stamp) const;
230  sensor_msgs::CameraInfo rightCameraInfo(const std::string& frame_id, const ros::Time& stamp) const;
231  sensor_msgs::CameraInfo auxCameraInfo(const std::string& frame_id,
232  const ros::Time& stamp,
233  const OperatingResolutionT& resolution) const;
234  sensor_msgs::CameraInfo auxCameraInfo(const std::string& frame_id,
235  const ros::Time& stamp,
236  size_t width,
237  size_t height) const;
238 
239  std::shared_ptr<RectificationRemapT> leftRemap() const;
240  std::shared_ptr<RectificationRemapT> rightRemap() const;
241 
242 private:
243 
247 
248  //
249  // Protect our cache during calibration updates
250 
251  mutable std::mutex mutex_;
252 
253  //
254  // Cache for quick queries
255 
256  Eigen::Matrix4d q_matrix_;
257 
258  sensor_msgs::CameraInfo left_camera_info_;
259  sensor_msgs::CameraInfo right_camera_info_;
260  sensor_msgs::CameraInfo aux_camera_info_;
261 
262  std::shared_ptr<RectificationRemapT> left_remap_;
263  std::shared_ptr<RectificationRemapT> right_remap_;
264 };
265 
266 }// namespace
267 
268 #endif
d
sensor_msgs::CameraInfo makeCameraInfo(const crl::multisense::image::Config &config, const crl::multisense::image::Calibration::Data &calibration, const crl::multisense::system::DeviceInfo &device_info, bool scale_calibration)
f
const crl::multisense::system::DeviceInfo & device_info_
RectificationRemapT makeRectificationRemap(const crl::multisense::image::Config &config, const crl::multisense::image::Calibration::Data &calibration, const crl::multisense::system::DeviceInfo &device_info)
static constexpr size_t S30_AUX_CAM_HEIGHT
crl::multisense::Channel * driver_
static constexpr size_t S30_AUX_CAM_WIDTH
Eigen::Matrix4d makeQ(const crl::multisense::image::Config &config, const crl::multisense::image::Calibration &calibration, const crl::multisense::system::DeviceInfo &device_info)
constexpr Eigen::Matrix< T, 3, 1 > ycbcrToBgr(const crl::multisense::image::Header &luma, const crl::multisense::image::Header &chroma, size_t u, size_t v)
const crl::multisense::image::Calibration calibration_
const T & data() const noexcept
std::shared_ptr< RectificationRemapT > left_remap_
std::shared_ptr< RectificationRemapT > right_remap_
crl::multisense::image::Config config_
BufferWrapper(crl::multisense::Channel *driver, const T &data)


multisense_ros
Author(s):
autogenerated on Sat Jun 24 2023 03:01:30