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-y : disable confirmation prompts\n");
74 
75  exit(-1);
76 }
77 
78 bool fileExists(const std::string& name)
79 {
80  struct stat sbuf;
81  return (0 == stat(name.c_str(), &sbuf));
82 }
83 
84 std::ostream& writeImageIntrinics (std::ostream& stream, image::Calibration const& calibration, bool hasAuxCamera)
85 {
86  stream << "%YAML:1.0\n";
87  writeMatrix (stream, "M1", 3, 3, &calibration.left.M[0][0]);
88  writeMatrix (stream, "D1", 1, 8, &calibration.left.D[0]);
89  writeMatrix (stream, "M2", 3, 3, &calibration.right.M[0][0]);
90  writeMatrix (stream, "D2", 1, 8, &calibration.right.D[0]);
91 
92  if (hasAuxCamera)
93  {
94  writeMatrix (stream, "M3", 3, 3, &calibration.aux.M[0][0]);
95  writeMatrix (stream, "D3", 1, 8, &calibration.aux.D[0]);
96  }
97  return stream;
98 }
99 
100 std::ostream& writeImageExtrinics (std::ostream& stream, image::Calibration const& calibration, bool hasAuxCamera)
101 {
102  stream << "%YAML:1.0\n";
103  writeMatrix (stream, "R1", 3, 3, &calibration.left.R[0][0]);
104  writeMatrix (stream, "P1", 3, 4, &calibration.left.P[0][0]);
105  writeMatrix (stream, "R2", 3, 3, &calibration.right.R[0][0]);
106  writeMatrix (stream, "P2", 3, 4, &calibration.right.P[0][0]);
107 
108  if (hasAuxCamera)
109  {
110  writeMatrix (stream, "R3", 3, 3, &calibration.aux.R[0][0]);
111  writeMatrix (stream, "P3", 3, 4, &calibration.aux.P[0][0]);
112  }
113  return stream;
114 }
115 
116 } // anonymous
117 
118 int main(int argc,
119  char **argvPP)
120 {
121  std::string ipAddress = "10.66.171.21";
122  std::string intrinsicsFile;
123  std::string extrinsicsFile;
124  bool setCal=false;
125  bool prompt=true;
126 
127  //
128  // Parse args
129 
130  int c;
131 
132  while(-1 != (c = getopt(argc, argvPP, "a:e:i:sy")))
133  switch(c) {
134  case 'a': ipAddress = std::string(optarg); break;
135  case 'i': intrinsicsFile = std::string(optarg); break;
136  case 'e': extrinsicsFile = std::string(optarg); break;
137  case 's': setCal = true; break;
138  case 'y': prompt = false; break;
139  default: usage(*argvPP); break;
140  }
141 
142  //
143  // Verify options
144 
145  if (intrinsicsFile.empty() || extrinsicsFile.empty()) {
146  fprintf(stderr, "Both intrinsics and extrinsics files must be set\n");
147  usage(*argvPP);
148  }
149 
150  if (true == setCal &&
151  (false == fileExists(intrinsicsFile) ||
152  false == fileExists(extrinsicsFile))) {
153 
154  fprintf(stderr, "intrinsics or extrinsics file not found\n");
155  usage(*argvPP);
156  }
157 
158  if (false == setCal && true == prompt &&
159  (true == fileExists(intrinsicsFile) ||
160  true == fileExists(extrinsicsFile))) {
161 
162  fprintf(stdout,
163  "One or both of \"%s\" and \"%s\" already exists.\n\n"
164  "Really overwrite these files? (y/n): ",
165  intrinsicsFile.c_str(),
166  extrinsicsFile.c_str());
167  fflush(stdout);
168 
169  int reply = getchar();
170  if ('Y' != reply && 'y' != reply) {
171  fprintf(stdout, "Aborting\n");
172  return 0;
173  }
174  }
175 
176  //
177  // Initialize communications.
178 
179  Channel *channelP = Channel::Create(ipAddress);
180  if (NULL == channelP) {
181  fprintf(stderr, "Failed to establish communications with \"%s\"\n",
182  ipAddress.c_str());
183  return -1;
184  }
185 
186  //
187  // Query Device Info
188 
189  Status status;
190 
191  system::DeviceInfo info;
192  bool hasAuxCamera = false;
193  status = channelP->getDeviceInfo(info);
194  if (Status_Ok != status)
195  {
196  fprintf(stderr, "Failed to query device info: %s\n",
197  Channel::statusString(status));
198  goto clean_out;
199  }
200 
203 
204  //
205  // Query
206 
207  if (false == setCal) {
208 
209  image::Calibration calibration;
210 
211  status = channelP->getImageCalibration(calibration);
212  if (Status_Ok != status) {
213  fprintf(stderr, "failed to query image calibration: %s\n",
214  Channel::statusString(status));
215  goto clean_out;
216  }
217 
218  std::ofstream inFile, exFile;
219 
220  inFile.open (intrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
221 
222  if (!inFile) {
223  fprintf(stderr, "failed to open '%s' for writing\n",
224  intrinsicsFile.c_str());
225  goto clean_out;
226  }
227 
228  exFile.open (extrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
229 
230  if (!exFile) {
231  fprintf(stderr, "failed to open '%s' for writing\n",
232  extrinsicsFile.c_str());
233  goto clean_out;
234  }
235 
236  writeImageIntrinics (inFile, calibration, hasAuxCamera);
237  writeImageExtrinics (exFile, calibration, hasAuxCamera);
238 
239  inFile.flush ();
240  exFile.flush ();
241 
242  } else {
243 
244  std::ifstream inFile, exFile;
245  std::map<std::string, std::vector<float> > data;
246 
247  inFile.open (intrinsicsFile.c_str ());
248 
249  if (!inFile) {
250  fprintf(stderr, "failed to open '%s' for reading\n",
251  intrinsicsFile.c_str());
252  goto clean_out;
253  }
254 
255  parseYaml (inFile, data);
256 
257  inFile.close ();
258 
259  if (data["M1"].size () != 3 * 3 ||
260  (data["D1"].size () != 5 && data["D1"].size () != 8) ||
261  data["M2"].size () != 3 * 3 ||
262  (data["D2"].size () != 5 && data["D2"].size () != 8) ||
263  (hasAuxCamera && data["M3"].size () != 3 * 3) ||
264  (hasAuxCamera && data["D3"].size () != 5 && data["D3"].size () != 8)) {
265  fprintf(stderr, "intrinsic matrices incomplete in %s\n",
266  intrinsicsFile.c_str());
267  goto clean_out;
268  }
269 
270  exFile.open (extrinsicsFile.c_str ());
271 
272  if (!exFile) {
273  fprintf(stderr, "failed to open '%s' for reading\n",
274  extrinsicsFile.c_str());
275  goto clean_out;
276  }
277 
278  parseYaml (exFile, data);
279 
280  exFile.close ();
281 
282  if (data["R1"].size () != 3 * 3 ||
283  data["P1"].size () != 3 * 4 ||
284  data["R2"].size () != 3 * 3 ||
285  data["P2"].size () != 3 * 4 ||
286  (hasAuxCamera && (data["R3"].size () != 3 * 3 || data["P3"].size () != 3 * 4))) {
287  fprintf(stderr, "extrinsic matrices incomplete in %s\n",
288  extrinsicsFile.c_str());
289  goto clean_out;
290  }
291 
292  image::Calibration calibration;
293 
294  memcpy (&calibration.left.M[0][0], &data["M1"].front (), data["M1"].size () * sizeof (float));
295  memset (&calibration.left.D[0], 0, sizeof (calibration.left.D));
296  memcpy (&calibration.left.D[0], &data["D1"].front (), data["D1"].size () * sizeof (float));
297  memcpy (&calibration.left.R[0][0], &data["R1"].front (), data["R1"].size () * sizeof (float));
298  memcpy (&calibration.left.P[0][0], &data["P1"].front (), data["P1"].size () * sizeof (float));
299 
300  memcpy (&calibration.right.M[0][0], &data["M2"].front (), data["M2"].size () * sizeof (float));
301  memset (&calibration.right.D[0], 0, sizeof (calibration.right.D));
302  memcpy (&calibration.right.D[0], &data["D2"].front (), data["D2"].size () * sizeof (float));
303  memcpy (&calibration.right.R[0][0], &data["R2"].front (), data["R2"].size () * sizeof (float));
304  memcpy (&calibration.right.P[0][0], &data["P2"].front (), data["P2"].size () * sizeof (float));
305 
306  if (hasAuxCamera)
307  {
308  memcpy (&calibration.aux.M[0][0], &data["M3"].front (), data["M3"].size () * sizeof (float));
309  memset (&calibration.aux.D[0], 0, sizeof (calibration.aux.D));
310  memcpy (&calibration.aux.D[0], &data["D3"].front (), data["D3"].size () * sizeof (float));
311  memcpy (&calibration.aux.R[0][0], &data["R3"].front (), data["R3"].size () * sizeof (float));
312  memcpy (&calibration.aux.P[0][0], &data["P3"].front (), data["P3"].size () * sizeof (float));
313  }
314 
315  status = channelP->setImageCalibration(calibration);
316  if (Status_Ok != status) {
317  fprintf(stderr, "failed to set image calibration: %s\n",
318  Channel::statusString(status));
319  goto clean_out;
320  }
321 
322  fprintf(stdout, "Image calibration successfully updated\n");
323  }
324 
325 clean_out:
326 
327  Channel::Destroy(channelP);
328  return 0;
329 }
static const char * statusString(Status status)
Definition: channel.cc:649
static Channel * Create(const std::string &sensorAddress)
Definition: channel.cc:623
std::ostream & writeMatrix(std::ostream &stream, std::string const &name, uint32_t rows, uint32_t columns, T const *data)
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 Status Status_Ok
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:636
char * optarg
Definition: getopt.c:29


multisense_lib
Author(s):
autogenerated on Sun Mar 14 2021 02:34:50