00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifdef HAVE_BUMBLEBEE2_CAM
00024 #include <cams/bumblebee2.h>
00025 #endif
00026 #include <fvutils/system/camargp.h>
00027 #include <utils/system/argparser.h>
00028 #include <fvutils/rectification/rectfile.h>
00029 #include <fvutils/rectification/rectinfo_block.h>
00030 #include <fvutils/rectification/rectinfo_lut_block.h>
00031
00032 #ifdef HAVE_TRICLOPS_SDK
00033 #include <stereo/triclops.h>
00034 #include <cerrno>
00035 #endif
00036
00037 #include <cstdlib>
00038 #include <cstdio>
00039
00040 using namespace fawkes;
00041 using namespace firevision;
00042
00043 void
00044 print_usage(ArgumentParser *argp)
00045 {
00046 printf("Usage: %s <-r|-v|-i> file.rectlut\n", argp->program_name());
00047 printf("You have to give at least one of -r/-v/-i and a file name\n"
00048 " -r retrieve rectification lut from live camera,\n"
00049 " uses first found Bumblebee2 camera\n"
00050 " -v verify rectification lut, compares the identification\n"
00051 " info stored in the file with the first currently\n"
00052 " attached camera\n"
00053 " -d deep verifiction of rectification LUT, compares the identification\n"
00054 " info stored in the file with the first currently attached camera. It\n"
00055 " also verifies each single mapping on equality.\n"
00056 " -i print info about rectification LUT file\n\n"
00057 );
00058 exit(1);
00059 }
00060
00061
00062 int
00063 retrieve(ArgumentParser *argp)
00064 {
00065 #ifdef HAVE_BUMBLEBEE2_CAM
00066 #ifdef HAVE_TRICLOPS_SDK
00067 const char *lut_file = argp->items()[0];
00068
00069 if ( access(lut_file, F_OK) == 0) {
00070 fprintf(stderr, "File with name %s exists, delete manually and retry. Aborting.\n", lut_file);
00071 return -1;
00072 }
00073 if ( access(lut_file, W_OK) != 0) {
00074
00075 if ( errno != ENOENT ) {
00076 fprintf(stderr, "Cannot write to file %s, permission problem?\n", lut_file);
00077 return -2;
00078 }
00079 }
00080
00081 CameraArgumentParser *cap = new CameraArgumentParser("bumblebee2:Bumblebee2 BB2-03S2C");
00082 Bumblebee2Camera *bb2 = new Bumblebee2Camera(cap);
00083 bb2->open();
00084
00085 TriclopsStereoProcessor *triclops = new TriclopsStereoProcessor(bb2);
00086 triclops->generate_rectification_lut(lut_file);
00087 delete triclops;
00088
00089 bb2->close();
00090
00091 delete bb2;
00092 delete cap;
00093 #else
00094 printf("Retrieving the rectification LUT from a camera is not supported,\n"
00095 "because the Triclops SDK was not available at compile time.\n");
00096 #endif
00097 #else
00098 printf("Retrieving the rectification LUT from a camera is not supported,\n"
00099 "because the Bumblebee2 support was not available at compile time.\n");
00100 #endif
00101
00102 return 0;
00103 }
00104
00105
00106 int
00107 verify(ArgumentParser *argp)
00108 {
00109 int rv = 0;
00110
00111 #ifdef HAVE_BUMBLEBEE2_CAM
00112 CameraArgumentParser *cap = new CameraArgumentParser("bumblebee2:Bumblebee2 BB2-03S2C");
00113 Bumblebee2Camera *bb2 = new Bumblebee2Camera(cap);
00114 bb2->open();
00115
00116 for (unsigned int i = 0; i < argp->num_items(); ++i) {
00117
00118 const char *lut_file = argp->items()[i];
00119
00120 if ( access(lut_file, F_OK) != 0) {
00121 fprintf(stderr, "File with name %s does not exist. Ignoring.\n", lut_file);
00122 continue;
00123 }
00124 if ( access(lut_file, R_OK) != 0) {
00125 fprintf(stderr, "Cannot read file %s, permission problem? Ingoring.\n", lut_file);
00126 continue;
00127 }
00128
00129 RectificationInfoFile *rif = new RectificationInfoFile();
00130 try {
00131 rif->read(lut_file);
00132
00133 if ( bb2->verify_guid( rif->guid() ) ) {
00134 printf("Success. The rectification info file has been created for the "
00135 "connected camera\n");
00136 } else {
00137 printf("Failure. The rectification info file has *not* been created "
00138 "for the connected camera\n");
00139 rv = 5;
00140 }
00141 } catch (Exception &e) {
00142 fprintf(stderr, "Failed to read lut file %s\n", lut_file);
00143 e.print_trace();
00144 }
00145
00146 delete rif;
00147
00148 }
00149
00150 bb2->close();
00151
00152 delete bb2;
00153 delete cap;
00154
00155 #else
00156 printf("Verifying the rectification LUT from a camera is not supported,\n"
00157 "because the Bumblebee2 support was not available at compile time.\n");
00158 #endif
00159
00160 return rv;
00161 }
00162
00163
00164 int
00165 deep_verify(ArgumentParser *argp)
00166 {
00167 #ifdef HAVE_BUMBLEBEE2_CAM
00168 #ifdef HAVE_TRICLOPS_SDK
00169 int rv = 0;
00170
00171 CameraArgumentParser *cap = new CameraArgumentParser("bumblebee2:Bumblebee2 BB2-03S2C");
00172 Bumblebee2Camera *bb2 = new Bumblebee2Camera(cap);
00173 bb2->open();
00174
00175 TriclopsStereoProcessor *triclops = new TriclopsStereoProcessor(bb2);
00176
00177 for (unsigned int i = 0; i < argp->num_items(); ++i) {
00178
00179 const char *lut_file = argp->items()[i];
00180
00181 if ( access(lut_file, F_OK) != 0) {
00182 fprintf(stderr, "File with name %s does not exist. Ignoring.\n", lut_file);
00183 continue;
00184 }
00185 if ( access(lut_file, R_OK) != 0) {
00186 fprintf(stderr, "Cannot read file %s, permission problem? Ingoring.\n", lut_file);
00187 continue;
00188 }
00189
00190 if ( triclops->verify_rectification_lut(lut_file) ) {
00191 printf("Success. LUT file %s contains matching configuration data.\n", lut_file);
00192 } else {
00193 printf("Failure. LUT file %s does not contain matching configuration data.\n", lut_file);
00194 }
00195
00196 }
00197
00198 delete triclops;
00199 bb2->close();
00200
00201 delete bb2;
00202 delete cap;
00203
00204 return rv;
00205 #else
00206 printf("Deep verification of the rectification LUT from a camera is not supported,\n"
00207 "because the Triclops SDK was not available at compile time.\n");
00208 return 0;
00209 #endif
00210 #else
00211 printf("Deep verification of the rectification LUT from a camera is not supported,\n"
00212 "because the Bumblebee2 support was not available at compile time.\n");
00213 return 0;
00214 #endif
00215 }
00216
00217
00218 void
00219 print_info(ArgumentParser *argp)
00220 {
00221 for (unsigned int i = 0; i < argp->num_items(); ++i) {
00222
00223 const char *lut_file = argp->items()[i];
00224
00225 if ( access(lut_file, F_OK) != 0) {
00226 fprintf(stderr, "File with name %s does not exist. Ignoring.\n", lut_file);
00227 continue;
00228 }
00229 if ( access(lut_file, R_OK) != 0) {
00230 fprintf(stderr, "Cannot read file %s, permission problem? Ingoring.\n", lut_file);
00231 continue;
00232 }
00233
00234 RectificationInfoFile *rif = new RectificationInfoFile();
00235 try {
00236 rif->read(lut_file);
00237 RectificationInfoFile::RectInfoBlockVector *blocks = rif->rectinfo_blocks();
00238
00239 printf("File: %s\n"
00240 "Version: %u\n"
00241 "Endianess: %s\n"
00242 "Num Blocks: %zu/%zu (header/read)\n"
00243 #if __WORDSIZE == 64
00244 "GUID: 0x%016lX\n"
00245 #else
00246 "GUID: 0x%016llX\n"
00247 #endif
00248 "Camera Model: %s\n",
00249 lut_file, rif->version(),
00250 rif->is_little_endian() ? "little endian" : "big endian",
00251 rif->num_blocks(), blocks->size(),
00252 rif->guid(), rif->model());
00253
00254 unsigned int u = 1;
00255 RectificationInfoFile::RectInfoBlockVector::const_iterator b;
00256 for (b = blocks->begin(); b != blocks->end(); ++b) {
00257 RectificationInfoBlock *rib = *b;
00258
00259 printf("\nRectInfo Block No. %u\n"
00260 "Type: %s\n"
00261 "Camera: %s\n"
00262 "Size: %zu\n",
00263 u++,
00264 rectinfo_type_strings[rib->type()],
00265 rectinfo_camera_strings[rib->camera()],
00266 rib->block_size());
00267
00268 switch (rib->type()) {
00269 case FIREVISION_RECTINFO_TYPE_LUT_16x16:
00270 {
00271 RectificationLutInfoBlock *rlib = dynamic_cast<RectificationLutInfoBlock *>(rib);
00272 if ( rlib == NULL ) {
00273 printf("** Failure to access LUT_16x16\n");
00274 } else {
00275 printf("LUT width: %hu\n"
00276 "LUT height: %hu\n",
00277 rlib->pixel_width(), rlib->pixel_height());
00278 }
00279 }
00280 break;
00281 default:
00282 printf("** No additional information available for this info type\n");
00283 break;
00284 }
00285 }
00286
00287 delete blocks;
00288 } catch (Exception &e) {
00289 fprintf(stderr, "Failed to read lut file %s\n", lut_file);
00290 e.print_trace();
00291 }
00292
00293 delete rif;
00294
00295 }
00296 }
00297
00298
00299 int
00300 main(int argc, char **argv)
00301 {
00302
00303 ArgumentParser argp(argc, argv, "rvid");
00304
00305 if (argp.num_items() == 0) {
00306 print_usage(&argp);
00307 }
00308
00309 if ( argp.has_arg("r") ) {
00310 return retrieve(&argp);
00311 } else if ( argp.has_arg("v") ) {
00312 return verify(&argp);
00313 } else if ( argp.has_arg("d") ) {
00314 return deep_verify(&argp);
00315 } else if ( argp.has_arg("i") ) {
00316 print_info(&argp);
00317 } else {
00318 print_usage(&argp);
00319 }
00320
00321 return 0;
00322 }