calibration.cc
Go to the documentation of this file.
1 
38 
39 namespace multisense {
40 namespace legacy {
41 
43 {
44  //
45  // Do a crude check the un-rectified focal length image center and distortion values. If these values
46  // are zero, then the cal is invalid
47  //
48  if (cal.M[0][0] < 0.1 || cal.M[0][2] < 0.1 || cal.M[1][1] < 0.1 || cal.M[1][2] < 0.1 || std::abs(cal.D[0]) < 1e-10)
49  {
50  return false;
51  }
52 
53  return true;
54 }
55 
57 {
58  const auto distortion_type = (cal.D[5] == 0.f && cal.D[6] == 0.f && cal.D[7] == 0.f) ?
61 
62  CameraCalibration output{};
63 
64  CPY_ARRAY_2(output.K, cal.M, 3, 3);
65  CPY_ARRAY_2(output.R, cal.R, 3, 3);
66  CPY_ARRAY_2(output.P, cal.P, 3, 4);
67 
68  output.distortion_type = distortion_type;
69 
70  if (distortion_type == CameraCalibration::DistortionType::PLUMBBOB)
71  {
72  output.D.resize(5);
73  memcpy(&output.D[0], cal.D, sizeof(float) * 5);
74  }
75  else
76  {
77  output.D.resize(8);
78  memcpy(&output.D[0], cal.D, sizeof(float) * 8);
79  }
80 
81  return output;
82 }
83 
85 {
86  using namespace crl::multisense::details;
87 
88  wire::CameraCalData output;
89 
90  if (cal.D.size() > (sizeof(output.D)/sizeof(float)))
91  {
92  CRL_EXCEPTION("Invalid input distortion size");
93  }
94 
95  CPY_ARRAY_2(output.M, cal.K, 3, 3);
96  memset(&output.D[0], 0, sizeof(output.D));
97  memcpy(&output.D[0], cal.D.data(), cal.D.size() * sizeof(float));
98  CPY_ARRAY_2(output.R, cal.R, 3, 3);
99  CPY_ARRAY_2(output.P, cal.P, 3, 4);
100 
101  return output;
102 }
103 
105 {
106  using namespace crl::multisense::details;
107 
108  StereoCalibration output{};
109 
110  output.left = convert(cal.left);
111  output.right = convert(cal.right);
112 
113  if (is_valid(cal.aux))
114  {
115  output.aux = convert(cal.aux);
116  }
117 
118  return output;
119 }
120 
122 {
123  using namespace crl::multisense::details;
124 
126 
127  output.left = convert(cal.left);
128  output.right = convert(cal.right);
129 
130  if (cal.aux)
131  {
132  output.aux = convert(cal.aux.value());
133  }
134  else
135  {
136  memset(output.aux.M, 0, sizeof(float) * 3 * 3);
137  memset(output.aux.D, 0, sizeof(float) * 8);
138  memset(output.aux.R, 0, sizeof(float) * 3 * 3);
139  memset(output.aux.P, 0, sizeof(float) * 3 * 4);
140  }
141 
142  return output;
143 }
144 
146 {
147  switch(source)
148  {
156  {
157  return input.left;
158  }
163  {
164  return input.right;
165  }
172  {
173  if (!input.aux)
174  {
175  CRL_EXCEPTION("Input source corresponds to invalid aux calibration");
176  }
177  return input.aux.value();
178  }
179  default: {CRL_EXCEPTION("Input source does not correspond to a image calibration");}
180  }
181 }
182 
183 CameraCalibration scale_calibration(const CameraCalibration &input, double x_scale, double y_scale)
184 {
185  auto output = input;
186 
187  output.K[0][0] = static_cast<float>(static_cast<double>(output.K[0][0]) * x_scale); // fx
188  output.K[0][2] = static_cast<float>(static_cast<double>(output.K[0][2]) * x_scale); // cx
189  output.K[1][1] = static_cast<float>(static_cast<double>(output.K[1][1]) * y_scale); // fy
190  output.K[1][2] = static_cast<float>(static_cast<double>(output.K[1][2]) * y_scale); // cy
191 
192  output.P[0][0] = static_cast<float>(static_cast<double>(output.P[0][0]) * x_scale); // fx
193  output.P[0][2] = static_cast<float>(static_cast<double>(output.P[0][2]) * x_scale); // cx
194  output.P[0][3] = static_cast<float>(static_cast<double>(output.P[0][3]) * x_scale); // fx * tx
195  output.P[1][1] = static_cast<float>(static_cast<double>(output.P[1][1]) * y_scale); // fy
196  output.P[1][2] = static_cast<float>(static_cast<double>(output.P[1][2]) * y_scale); // cy
197 
198  return output;
199 }
200 
201 StereoCalibration scale_calibration(const StereoCalibration &input, double x_scale, double y_scale)
202 {
203  auto output = input;
204 
205  output.left = scale_calibration(input.left, x_scale, y_scale);
206  output.right = scale_calibration(input.right, x_scale, y_scale);
207  if (input.aux)
208  {
209  output.aux = scale_calibration(input.aux.value(), x_scale, y_scale);
210  }
211 
212  return output;
213 }
214 
215 }
216 }
multisense::DataSource::RIGHT_RECTIFIED_COMPRESSED
@ RIGHT_RECTIFIED_COMPRESSED
multisense::DataSource::RIGHT_MONO_COMPRESSED
@ RIGHT_MONO_COMPRESSED
multisense::CameraCalibration::R
std::array< std::array< float, 3 >, 3 > R
Rotation matrix which takes points in the unrectified camera frame and transform them in to the recti...
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:136
multisense::legacy::is_valid
bool is_valid(const crl::multisense::details::wire::CameraCalData &cal)
Check if the CameraCalData object is valid.
Definition: calibration.cc:42
crl::multisense::details
Definition: Legacy/details/channel.cc:63
multisense::StereoCalibration::left
CameraCalibration left
Calibration information for the left camera.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:171
multisense::StereoCalibration
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:166
crl::multisense::details::wire::CameraCalData::R
float R[3][3]
Definition: SysCameraCalibrationMessage.hh:55
multisense::legacy::scale_calibration
CameraCalibration scale_calibration(const CameraCalibration &input, double x_scale, double y_scale)
Scale a calibration used to update a full-res calibration based on the current operating resolution.
Definition: calibration.cc:183
multisense::StereoCalibration::aux
std::optional< CameraCalibration > aux
Calibration information for the aux camera (optional 3rd center camera)
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:181
crl::multisense::details::wire::CameraCalData::P
float P[3][4]
Definition: SysCameraCalibrationMessage.hh:56
crl::multisense::details::wire::SysCameraCalibration::left
CameraCalData left
Definition: SysCameraCalibrationMessage.hh:75
multisense::DataSource::AUX_COMPRESSED
@ AUX_COMPRESSED
crl::multisense::details::wire::SysCameraCalibration
Definition: SysCameraCalibrationMessage.hh:70
multisense::CameraCalibration::P
std::array< std::array< float, 4 >, 3 > P
Rectified projection matrix which takes points in the origin camera coordinate frame and projects the...
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:142
multisense::CameraCalibration::K
std::array< std::array< float, 3 >, 3 > K
Unrectified camera projection matrix stored in row-major ordering.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:130
multisense::DataSource::LEFT_RECTIFIED_RAW
@ LEFT_RECTIFIED_RAW
multisense::DataSource::AUX_LUMA_RAW
@ AUX_LUMA_RAW
multisense::DataSource::LEFT_DISPARITY_COMPRESSED
@ LEFT_DISPARITY_COMPRESSED
multisense::DataSource::AUX_LUMA_RECTIFIED_RAW
@ AUX_LUMA_RECTIFIED_RAW
multisense::DataSource::RIGHT_MONO_RAW
@ RIGHT_MONO_RAW
multisense::DataSource::LEFT_MONO_RAW
@ LEFT_MONO_RAW
multisense::CameraCalibration::D
std::vector< float > D
Coefficients for the distortion model.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:152
multisense::CameraCalibration::DistortionType::RATIONAL_POLYNOMIAL
@ RATIONAL_POLYNOMIAL
multisense::DataSource
DataSource
Identifies which camera or data source the image is from.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:83
CRL_EXCEPTION
#define CRL_EXCEPTION(fmt,...)
Definition: Exception.hh:85
crl::multisense::details::wire::CameraCalData::D
float D[8]
Definition: SysCameraCalibrationMessage.hh:54
crl::multisense::details::wire::SysCameraCalibration::aux
CameraCalData aux
Definition: SysCameraCalibrationMessage.hh:77
calibration.hh
crl::multisense::details::wire::SysCameraCalibration::right
CameraCalData right
Definition: SysCameraCalibrationMessage.hh:76
multisense::DataSource::COST_RAW
@ COST_RAW
crl::multisense::details::wire::CameraCalData::M
float M[3][3]
Definition: SysCameraCalibrationMessage.hh:53
crl::multisense::details::wire::CameraCalData
Definition: SysCameraCalibrationMessage.hh:49
multisense::DataSource::LEFT_MONO_COMPRESSED
@ LEFT_MONO_COMPRESSED
multisense::legacy::convert
CameraCalibration convert(const crl::multisense::details::wire::CameraCalData &cal)
Convert a wire calibration to our API calibration object.
Definition: calibration.cc:56
multisense::DataSource::AUX_CHROMA_RECTIFIED_RAW
@ AUX_CHROMA_RECTIFIED_RAW
multisense::legacy::select_calibration
CameraCalibration select_calibration(const StereoCalibration &input, const DataSource &source)
Get the correct calibration corresponding to the input source.
Definition: calibration.cc:145
multisense::CameraCalibration::DistortionType::PLUMBBOB
@ PLUMBBOB
multisense::StereoCalibration::right
CameraCalibration right
Calibration information for the right camera.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:176
multisense
Definition: factory.cc:39
multisense::DataSource::RIGHT_RECTIFIED_RAW
@ RIGHT_RECTIFIED_RAW
multisense::DataSource::AUX_CHROMA_RAW
@ AUX_CHROMA_RAW
multisense::DataSource::AUX_RECTIFIED_COMPRESSED
@ AUX_RECTIFIED_COMPRESSED
CPY_ARRAY_2
#define CPY_ARRAY_2(d_, s_, n_, m_)
Definition: Protocol.hh:360
multisense::CameraCalibration
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:115
multisense::DataSource::LEFT_RECTIFIED_COMPRESSED
@ LEFT_RECTIFIED_COMPRESSED
multisense::DataSource::LEFT_DISPARITY_RAW
@ LEFT_DISPARITY_RAW


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:08