Legacy/ImageCalUtility/ImageCalUtility.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 <stdio.h>
49 #include <stdlib.h>
50 #include <sys/types.h>
51 #include <sys/stat.h>
52 #include <fstream>
53 #include <map>
54 #include <string.h>
55 
56 #include <getopt/getopt.h>
57 #include <CalibrationYaml.hh>
58 #include <MultiSense/MultiSenseChannel.hh>
59 #include <MultiSense/MultiSenseTypes.hh>
60 
61 using namespace crl::multisense;
62 
63 namespace { // anonymous
64 
65 void usage(const char *programNameP)
66 {
67  fprintf(stderr,
68  "USAGE: %s -e <extrinsics_file> -i <intrinsics_file> [<options>]\n",
69  programNameP);
70  fprintf(stderr, "Where <options> are:\n");
71  fprintf(stderr, "\t-a <ip_address> : ip address (default=10.66.171.21)\n");
72  fprintf(stderr, "\t-s : set the calibration (default is query)\n");
73  fprintf(stderr, "\t-r : remote head channel (options: VPB, 0, 1, 2, 3)\n");
74  fprintf(stderr, "\t-y : disable confirmation prompts\n");
75 
76  exit(-1);
77 }
78 
79 bool fileExists(const std::string& name)
80 {
81  struct stat sbuf;
82  return (0 == stat(name.c_str(), &sbuf));
83 }
84 
85 static int getRemoteHeadIdFromString(const std::string &head_str, RemoteHeadChannel & rh)
86 {
87  int err = 0;
88 
89  if (head_str == "VPB")
90  rh = Remote_Head_VPB;
91  else if (head_str == "0")
92  rh = Remote_Head_0;
93  else if (head_str == "1")
94  rh = Remote_Head_1;
95  else if (head_str == "2")
96  rh = Remote_Head_2;
97  else if (head_str == "3")
98  rh = Remote_Head_3;
99  else {
100  std::cerr << "Error: Unrecognized remote head" << '\n';
101  std::cerr << "Please use one of the following:" << '\n';
102  std::cerr << "\tVPB" << '\n';
103  std::cerr << "\t0" << '\n';
104  std::cerr << "\t1" << '\n';
105  std::cerr << "\t2" << '\n';
106  std::cerr << "\t3" << '\n';
107  err = -1;
108  }
109 
110  return err;
111 }
112 
113 std::ostream& writeImageIntrinsics (std::ostream& stream, image::Calibration const& calibration, bool hasAuxCamera)
114 {
115  stream << "%YAML:1.0\n";
116  writeMatrix (stream, "M1", 3, 3, &calibration.left.M[0][0]);
117  writeMatrix (stream, "D1", 1, 8, &calibration.left.D[0]);
118  writeMatrix (stream, "M2", 3, 3, &calibration.right.M[0][0]);
119  writeMatrix (stream, "D2", 1, 8, &calibration.right.D[0]);
120 
121  if (hasAuxCamera)
122  {
123  writeMatrix (stream, "M3", 3, 3, &calibration.aux.M[0][0]);
124  writeMatrix (stream, "D3", 1, 8, &calibration.aux.D[0]);
125  }
126  return stream;
127 }
128 
129 std::ostream& writeImageExtrinsics (std::ostream& stream, image::Calibration const& calibration, bool hasAuxCamera)
130 {
131  stream << "%YAML:1.0\n";
132  writeMatrix (stream, "R1", 3, 3, &calibration.left.R[0][0]);
133  writeMatrix (stream, "P1", 3, 4, &calibration.left.P[0][0]);
134  writeMatrix (stream, "R2", 3, 3, &calibration.right.R[0][0]);
135  writeMatrix (stream, "P2", 3, 4, &calibration.right.P[0][0]);
136 
137  if (hasAuxCamera)
138  {
139  writeMatrix (stream, "R3", 3, 3, &calibration.aux.R[0][0]);
140  writeMatrix (stream, "P3", 3, 4, &calibration.aux.P[0][0]);
141  }
142  return stream;
143 }
144 
145 } // anonymous
146 
147 int main(int argc,
148  char **argvPP)
149 {
150  std::string ipAddress = "10.66.171.21";
151  std::string intrinsicsFile;
152  std::string extrinsicsFile;
153  std::string remoteHeadChannelId;
154  bool cameraRemoteHead=false;
155  bool setCal=false;
156  bool prompt=true;
157 
158  //
159  // Parse args
160 
161  int c;
162 
163  while(-1 != (c = getopt(argc, argvPP, "a:e:i:r:sy")))
164  switch(c) {
165  case 'a': ipAddress = std::string(optarg); break;
166  case 'i': intrinsicsFile = std::string(optarg); break;
167  case 'e': extrinsicsFile = std::string(optarg); break;
168  case 'r': {
169  remoteHeadChannelId = std::string(optarg);
170  cameraRemoteHead = true;
171  break;
172  }
173  case 's': setCal = true; break;
174  case 'y': prompt = false; break;
175  default: usage(*argvPP); break;
176  }
177 
178  //
179  // Verify options
180 
181  if (intrinsicsFile.empty() || extrinsicsFile.empty()) {
182  fprintf(stderr, "Both intrinsics and extrinsics files must be set\n");
183  usage(*argvPP);
184  }
185 
186  if (true == setCal &&
187  (false == fileExists(intrinsicsFile) ||
188  false == fileExists(extrinsicsFile))) {
189 
190  fprintf(stderr, "intrinsics or extrinsics file not found\n");
191  usage(*argvPP);
192  }
193 
194  if (false == setCal && true == prompt &&
195  (true == fileExists(intrinsicsFile) ||
196  true == fileExists(extrinsicsFile))) {
197 
198  fprintf(stdout,
199  "One or both of \"%s\" and \"%s\" already exists.\n\n"
200  "Really overwrite these files? (y/n): ",
201  intrinsicsFile.c_str(),
202  extrinsicsFile.c_str());
203  fflush(stdout);
204 
205  int reply = getchar();
206  if ('Y' != reply && 'y' != reply) {
207  fprintf(stdout, "Aborting\n");
208  return 0;
209  }
210  }
211 
212  //
213  // Initialize communications.
214  Channel *channelP = NULL;
215  if (cameraRemoteHead) {
216  RemoteHeadChannel rch;
217  if (getRemoteHeadIdFromString(remoteHeadChannelId, rch) < 0) {
218  return -1;
219  }
220  channelP = Channel::Create(ipAddress, rch);
221  }
222  else {
223  channelP = Channel::Create(ipAddress);
224  }
225 
226  if (NULL == channelP) {
227  fprintf(stderr, "Failed to establish communications with \"%s\"\n",
228  ipAddress.c_str());
229  return -1;
230  }
231 
232  //
233  // Query Device Info
234 
235  Status status;
236 
237  system::DeviceInfo info;
238  bool hasAuxCamera = false;
239  status = channelP->getDeviceInfo(info);
240  if (Status_Ok != status)
241  {
242  fprintf(stderr, "Failed to query device info: %s\n",
243  Channel::statusString(status));
244  goto clean_out;
245  }
246 
251 
252  //
253  // Query
254 
255  if (false == setCal) {
256 
257  image::Calibration calibration;
258 
259  status = channelP->getImageCalibration(calibration);
260  if (Status_Ok != status) {
261  fprintf(stderr, "failed to query image calibration: %s\n",
262  Channel::statusString(status));
263  goto clean_out;
264  }
265 
266  std::ofstream inFile, exFile;
267 
268  inFile.open (intrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
269 
270  if (!inFile) {
271  fprintf(stderr, "failed to open '%s' for writing\n",
272  intrinsicsFile.c_str());
273  goto clean_out;
274  }
275 
276  exFile.open (extrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
277 
278  if (!exFile) {
279  fprintf(stderr, "failed to open '%s' for writing\n",
280  extrinsicsFile.c_str());
281  goto clean_out;
282  }
283 
284  writeImageIntrinsics (inFile, calibration, hasAuxCamera);
285  writeImageExtrinsics (exFile, calibration, hasAuxCamera);
286 
287  inFile.flush ();
288  exFile.flush ();
289 
290  } else {
291 
292  std::ifstream inFile, exFile;
293  std::map<std::string, std::vector<float> > data;
294 
295  inFile.open (intrinsicsFile.c_str ());
296 
297  if (!inFile) {
298  fprintf(stderr, "failed to open '%s' for reading\n",
299  intrinsicsFile.c_str());
300  goto clean_out;
301  }
302 
303  parseYaml (inFile, data);
304 
305  inFile.close ();
306 
307  if (data["M1"].size () != 3 * 3 ||
308  (data["D1"].size () != 5 && data["D1"].size () != 8) ||
309  data["M2"].size () != 3 * 3 ||
310  (data["D2"].size () != 5 && data["D2"].size () != 8) ||
311  (hasAuxCamera && data["M3"].size () != 3 * 3) ||
312  (hasAuxCamera && data["D3"].size () != 5 && data["D3"].size () != 8)) {
313  fprintf(stderr, "intrinsic matrices incomplete in %s\n",
314  intrinsicsFile.c_str());
315  goto clean_out;
316  }
317 
318  exFile.open (extrinsicsFile.c_str ());
319 
320  if (!exFile) {
321  fprintf(stderr, "failed to open '%s' for reading\n",
322  extrinsicsFile.c_str());
323  goto clean_out;
324  }
325 
326  parseYaml (exFile, data);
327 
328  exFile.close ();
329 
330  if (data["R1"].size () != 3 * 3 ||
331  data["P1"].size () != 3 * 4 ||
332  data["R2"].size () != 3 * 3 ||
333  data["P2"].size () != 3 * 4 ||
334  (hasAuxCamera && (data["R3"].size () != 3 * 3 || data["P3"].size () != 3 * 4))) {
335  fprintf(stderr, "extrinsic matrices incomplete in %s\n",
336  extrinsicsFile.c_str());
337  goto clean_out;
338  }
339 
340  image::Calibration calibration;
341 
342  memcpy (&calibration.left.M[0][0], &data["M1"].front (), data["M1"].size () * sizeof (float));
343  memset (&calibration.left.D[0], 0, sizeof (calibration.left.D));
344  memcpy (&calibration.left.D[0], &data["D1"].front (), data["D1"].size () * sizeof (float));
345  memcpy (&calibration.left.R[0][0], &data["R1"].front (), data["R1"].size () * sizeof (float));
346  memcpy (&calibration.left.P[0][0], &data["P1"].front (), data["P1"].size () * sizeof (float));
347 
348  memcpy (&calibration.right.M[0][0], &data["M2"].front (), data["M2"].size () * sizeof (float));
349  memset (&calibration.right.D[0], 0, sizeof (calibration.right.D));
350  memcpy (&calibration.right.D[0], &data["D2"].front (), data["D2"].size () * sizeof (float));
351  memcpy (&calibration.right.R[0][0], &data["R2"].front (), data["R2"].size () * sizeof (float));
352  memcpy (&calibration.right.P[0][0], &data["P2"].front (), data["P2"].size () * sizeof (float));
353 
354  if (hasAuxCamera) {
355  memcpy (&calibration.aux.M[0][0], &data["M3"].front (), data["M3"].size () * sizeof (float));
356  memset (&calibration.aux.D[0], 0, sizeof (calibration.aux.D));
357  memcpy (&calibration.aux.D[0], &data["D3"].front (), data["D3"].size () * sizeof (float));
358  memcpy (&calibration.aux.R[0][0], &data["R3"].front (), data["R3"].size () * sizeof (float));
359  memcpy (&calibration.aux.P[0][0], &data["P3"].front (), data["P3"].size () * sizeof (float));
360  }
361 
362  status = channelP->setImageCalibration(calibration);
363  if (Status_Ok != status) {
364  fprintf(stderr, "failed to set image calibration: %s\n",
365  Channel::statusString(status));
366  goto clean_out;
367  }
368 
369  fprintf(stdout, "Image calibration successfully updated\n");
370  }
371 
372 clean_out:
373 
374  Channel::Destroy(channelP);
375  return 0;
376 }
usage
static void usage()
Definition: FirmwareUpdateUtility.cc:51
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
crl::multisense::Channel::getDeviceInfo
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
crl::multisense::Remote_Head_0
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_0
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:214
getopt.h
getopt
int getopt(int argc, char **argv, char *opts)
Definition: getopt.c:31
crl::multisense::Channel::Destroy
static void Destroy(Channel *instanceP)
Definition: Legacy/details/channel.cc:863
crl::multisense::Remote_Head_VPB
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:212
parseYaml
std::istream & parseYaml(std::istream &stream, std::map< std::string, std::vector< float > > &data)
Definition: CalibrationYaml.hh:146
crl::multisense::image::Calibration::Data::P
float P[3][4]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1927
crl::multisense::Channel::getImageCalibration
virtual Status getImageCalibration(image::Calibration &c)=0
crl::multisense::image::Calibration::aux
Data aux
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1935
crl::multisense::image::Calibration::Data::M
float M[3][3]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1920
crl::multisense::image::Calibration::left
Data left
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1931
crl::multisense::Remote_Head_3
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_3
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:220
crl::multisense::Remote_Head_1
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_1
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:216
crl::multisense::Channel::setImageCalibration
virtual Status setImageCalibration(const image::Calibration &c)=0
crl::multisense::image::Calibration::Data::D
float D[8]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1923
writeMatrix
std::ostream & writeMatrix(std::ostream &stream, std::string const &name, uint32_t rows, uint32_t columns, T const *data)
Definition: CalibrationYaml.hh:45
crl::multisense::Channel::statusString
static const char * statusString(Status status)
Definition: Legacy/details/channel.cc:876
crl::multisense::system::DeviceInfo
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3245
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_MONOCAM
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3262
crl::multisense::system::DeviceInfo::hardwareRevision
uint32_t hardwareRevision
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3297
crl::multisense::image::Calibration
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1910
crl::multisense::Channel::Create
static Channel * Create(const std::string &sensorAddress)
Definition: Legacy/details/channel.cc:817
crl::multisense::Remote_Head_2
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_2
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:218
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_C6S2_S27
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3258
crl::multisense::Status
int32_t Status
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:94
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21i
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21i
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3268
crl::multisense::Channel
Definition: Legacy/include/MultiSense/MultiSenseChannel.hh:69
CalibrationYaml.hh
crl::multisense::image::Calibration::Data::R
float R[3][3]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1925
crl::multisense
Definition: Legacy/details/channel.cc:62
main
int main(int argc, char **argvPP)
Definition: Legacy/ImageCalUtility/ImageCalUtility.cc:147
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_S30
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3259
optarg
char * optarg
Definition: getopt.c:29
crl::multisense::image::Calibration::right
Data right
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1933
crl::multisense::RemoteHeadChannel
int16_t RemoteHeadChannel
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:210


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