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 
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 <extrinisics_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& writeImageIntrinics (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& writeImageExtrinics (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 
250 
251  //
252  // Query
253 
254  if (false == setCal) {
255 
256  image::Calibration calibration;
257 
258  status = channelP->getImageCalibration(calibration);
259  if (Status_Ok != status) {
260  fprintf(stderr, "failed to query image calibration: %s\n",
261  Channel::statusString(status));
262  goto clean_out;
263  }
264 
265  std::ofstream inFile, exFile;
266 
267  inFile.open (intrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
268 
269  if (!inFile) {
270  fprintf(stderr, "failed to open '%s' for writing\n",
271  intrinsicsFile.c_str());
272  goto clean_out;
273  }
274 
275  exFile.open (extrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
276 
277  if (!exFile) {
278  fprintf(stderr, "failed to open '%s' for writing\n",
279  extrinsicsFile.c_str());
280  goto clean_out;
281  }
282 
283  writeImageIntrinics (inFile, calibration, hasAuxCamera);
284  writeImageExtrinics (exFile, calibration, hasAuxCamera);
285 
286  inFile.flush ();
287  exFile.flush ();
288 
289  } else {
290 
291  std::ifstream inFile, exFile;
292  std::map<std::string, std::vector<float> > data;
293 
294  inFile.open (intrinsicsFile.c_str ());
295 
296  if (!inFile) {
297  fprintf(stderr, "failed to open '%s' for reading\n",
298  intrinsicsFile.c_str());
299  goto clean_out;
300  }
301 
302  parseYaml (inFile, data);
303 
304  inFile.close ();
305 
306  if (data["M1"].size () != 3 * 3 ||
307  (data["D1"].size () != 5 && data["D1"].size () != 8) ||
308  data["M2"].size () != 3 * 3 ||
309  (data["D2"].size () != 5 && data["D2"].size () != 8) ||
310  (hasAuxCamera && data["M3"].size () != 3 * 3) ||
311  (hasAuxCamera && data["D3"].size () != 5 && data["D3"].size () != 8)) {
312  fprintf(stderr, "intrinsic matrices incomplete in %s\n",
313  intrinsicsFile.c_str());
314  goto clean_out;
315  }
316 
317  exFile.open (extrinsicsFile.c_str ());
318 
319  if (!exFile) {
320  fprintf(stderr, "failed to open '%s' for reading\n",
321  extrinsicsFile.c_str());
322  goto clean_out;
323  }
324 
325  parseYaml (exFile, data);
326 
327  exFile.close ();
328 
329  if (data["R1"].size () != 3 * 3 ||
330  data["P1"].size () != 3 * 4 ||
331  data["R2"].size () != 3 * 3 ||
332  data["P2"].size () != 3 * 4 ||
333  (hasAuxCamera && (data["R3"].size () != 3 * 3 || data["P3"].size () != 3 * 4))) {
334  fprintf(stderr, "extrinsic matrices incomplete in %s\n",
335  extrinsicsFile.c_str());
336  goto clean_out;
337  }
338 
339  image::Calibration calibration;
340 
341  memcpy (&calibration.left.M[0][0], &data["M1"].front (), data["M1"].size () * sizeof (float));
342  memset (&calibration.left.D[0], 0, sizeof (calibration.left.D));
343  memcpy (&calibration.left.D[0], &data["D1"].front (), data["D1"].size () * sizeof (float));
344  memcpy (&calibration.left.R[0][0], &data["R1"].front (), data["R1"].size () * sizeof (float));
345  memcpy (&calibration.left.P[0][0], &data["P1"].front (), data["P1"].size () * sizeof (float));
346 
347  memcpy (&calibration.right.M[0][0], &data["M2"].front (), data["M2"].size () * sizeof (float));
348  memset (&calibration.right.D[0], 0, sizeof (calibration.right.D));
349  memcpy (&calibration.right.D[0], &data["D2"].front (), data["D2"].size () * sizeof (float));
350  memcpy (&calibration.right.R[0][0], &data["R2"].front (), data["R2"].size () * sizeof (float));
351  memcpy (&calibration.right.P[0][0], &data["P2"].front (), data["P2"].size () * sizeof (float));
352 
353  if (hasAuxCamera) {
354  memcpy (&calibration.aux.M[0][0], &data["M3"].front (), data["M3"].size () * sizeof (float));
355  memset (&calibration.aux.D[0], 0, sizeof (calibration.aux.D));
356  memcpy (&calibration.aux.D[0], &data["D3"].front (), data["D3"].size () * sizeof (float));
357  memcpy (&calibration.aux.R[0][0], &data["R3"].front (), data["R3"].size () * sizeof (float));
358  memcpy (&calibration.aux.P[0][0], &data["P3"].front (), data["P3"].size () * sizeof (float));
359  }
360 
361  status = channelP->setImageCalibration(calibration);
362  if (Status_Ok != status) {
363  fprintf(stderr, "failed to set image calibration: %s\n",
364  Channel::statusString(status));
365  goto clean_out;
366  }
367 
368  fprintf(stdout, "Image calibration successfully updated\n");
369  }
370 
371 clean_out:
372 
373  Channel::Destroy(channelP);
374  return 0;
375 }
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
static const char * statusString(Status status)
Definition: channel.cc:802
static Channel * Create(const std::string &sensorAddress)
Definition: channel.cc:743
std::ostream & writeMatrix(std::ostream &stream, std::string const &name, uint32_t rows, uint32_t columns, T const *data)
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_0
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_2
int main(int argc, char **argvPP)
int getopt(int argc, char **argv, char *opts)
Definition: getopt.c:31
virtual Status getImageCalibration(image::Calibration &c)=0
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
static CRL_CONSTEXPR Status Status_Ok
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_1
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
virtual Status setImageCalibration(const image::Calibration &c)=0
def usage(progname)
std::istream & parseYaml(std::istream &stream, std::map< std::string, std::vector< float > > &data)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
static void Destroy(Channel *instanceP)
Definition: channel.cc:789
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_3
char * optarg
Definition: getopt.c:29


multisense_lib
Author(s):
autogenerated on Sat Jun 24 2023 03:01:21