LibMultiSense/RectifiedFocalLengthUtility/RectifiedFocalLengthUtility.cc
Go to the documentation of this file.
1 
37 #ifdef WIN32
38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
40 #endif
41 
42 #include <windows.h>
43 #include <winsock2.h>
44 #else
45 #include <unistd.h>
46 #endif
47 
48 #include <iostream>
49 
50 #include <MultiSense/MultiSenseChannel.hh>
52 
53 #include "getopt/getopt.h"
54 
55 namespace lms = multisense;
56 
57 namespace
58 {
59 
60 void usage(const char *name)
61 {
62  std::cerr << "USAGE: " << name << " [<options>]" << std::endl;
63  std::cerr << "Where <options> are:" << std::endl;
64  std::cerr << "\t-a <current_address> : CURRENT IPV4 address (default=10.66.171.21)" << std::endl;
65  std::cerr << "\t-m <mtu> : MTU to use to communicate with the camera (default=1500)" << std::endl;
66  std::cerr << "\t-r <new-rectified-focal-length> : The new rectified focal length" << std::endl;
67  std::cerr << "\t-s : Set the new calibration (Default is query)" << std::endl;
68  exit(1);
69 }
70 
72 {
73  std::cout << "Updating focal length from " << cal.left.P[0][0] << " to " << new_focal_length << std::endl;
74 
75  cal.left.P[0][0] = new_focal_length;
76  cal.left.P[1][1] = new_focal_length;
77 
78  const float right_tx = cal.right.P[0][3] / cal.right.P[0][0];
79  cal.right.P[0][0] = new_focal_length;
80  cal.right.P[1][1] = new_focal_length;
81  cal.right.P[0][3] = new_focal_length * right_tx;
82 
83  if (cal.aux)
84  {
85  const float aux_tx = cal.aux->P[0][3] / cal.aux->P[0][0];
86  const float aux_ty = cal.aux->P[1][3] / cal.aux->P[1][1];
87 
88  cal.aux->P[0][0] = new_focal_length;
89  cal.aux->P[1][1] = new_focal_length;
90  cal.aux->P[0][3] = new_focal_length * aux_tx;
91  cal.aux->P[1][3] = new_focal_length * aux_ty;
92  }
93 
94  return cal;
95 }
96 
97 }
98 
99 int main(int argc, char** argv)
100 {
101  std::string ip_address = "10.66.171.21";
102  int16_t mtu = 1500;
103  std::optional<float> rectified_focal_length = std::nullopt;
104  bool set = false;
105 
106  int c;
107  while(-1 != (c = getopt(argc, argv, "a:m:r:s")))
108  {
109  switch(c)
110  {
111  case 'a': ip_address = std::string(optarg); break;
112  case 'm': mtu = static_cast<uint16_t>(atoi(optarg)); break;
113  case 'r': rectified_focal_length = std::stof(optarg); break;
114  case 's': set = true; break;
115  default: usage(*argv); break;
116  }
117  }
118 
119  if (!rectified_focal_length || rectified_focal_length.value() < 0.0)
120  {
121  std::cerr << "Invalid input rectified focal length" << std::endl;;
122  usage(*argv);
123  }
124 
125  const auto channel = lms::Channel::create(lms::Channel::Config{ip_address, mtu});
126  if (!channel)
127  {
128  std::cerr << "Failed to create channel" << std::endl;
129  return 1;
130  }
131 
132  const auto current_calibration = channel->get_calibration();
133 
134  const auto new_calibration = update_calibration(current_calibration, rectified_focal_length.value());
135 
136  if (set)
137  {
138  if (channel->set_calibration(new_calibration) != lms::Status::OK)
139  {
140  std::cerr << "Failed to set the updated calibration" << std::endl;
141  return 1;
142  }
143  }
144  else
145  {
146  std::cout << "Please add the \"-s\" argument to write the new rectified focal length to the camera" << std::endl;
147  }
148 
149  return 0;
150 }
usage
static void usage()
Definition: FirmwareUpdateUtility.cc:51
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
multisense::StereoCalibration::aux
std::optional< CameraCalibration > aux
Calibration information for the aux camera (optional 3rd center camera)
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:181
getopt.h
getopt
int getopt(int argc, char **argv, char *opts)
Definition: getopt.c:31
MultiSenseUtilities.hh
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
main
int main(int argc, char **argv)
Definition: LibMultiSense/RectifiedFocalLengthUtility/RectifiedFocalLengthUtility.cc:99
rectified_focal_length_utility.update_calibration
def update_calibration(cal, new_focal_length)
Definition: rectified_focal_length_utility.py:42
multisense::Channel::create
static std::unique_ptr< Channel > create(const Config &config, const ChannelImplementation &impl=ChannelImplementation::LEGACY)
Factory create function which allows for switching between different channel implementations.
Definition: factory.cc:42
multisense::StereoCalibration::right
CameraCalibration right
Calibration information for the right camera.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:176
multisense
Definition: factory.cc:39
optarg
char * optarg
Definition: getopt.c:29


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