Merger.hpp
00001 //
00002 // Profile Merger Tool for SAL3D.
00003 // Copyright 2008-2010 AQSENSE, S.L.
00004 //
00005 #if !defined (AQSENSE_SAL3DPP_MERGER_HPP)
00006 #define AQSENSE_SAL3DPP_MERGER_HPP
00007 
00008 #if defined (_MSC_VER) && (_MSC_VER >= 1020)
00009 #pragma once
00010 #endif
00011 
00012 #include <sal3d/merger.h>
00013 #include <cstddef>
00014 #include <limits>
00015 #include <stdexcept>
00016 #include <vector>
00017 #include "RangeMap.hpp"
00018 #include "Profile.hpp"
00019 #include "Common.hpp"
00020 
00021 // Remove the definition of max that some headers include (notably windows.h)
00022 #if defined (max)
00023 #undef max
00024 #endif
00025 
00026 namespace sal3d
00027 {
00108     namespace Merger
00109     {
00123         class Config
00124         {
00125         public:
00138             explicit Config (sal3d_merger_config c_config):
00139                 _c_config(c_config)
00140             {
00141             }
00142 
00150             Config (const Config &mc)
00151                 : _c_config(mc._c_config)
00152             {
00153                 Error e;
00154                 sal3d_merger_config_share(_c_config, &e.e);
00155                 if (e.e.value < 0)
00156                     throw e;
00157             }
00158 
00168             Config &
00169             operator= (const Config &mc)
00170             {
00171                 _c_config = mc._c_config;
00172                 Error e;
00173                 sal3d_merger_config_share(_c_config, &e.e);
00174                 if (e.e.value < 0)
00175                     throw e;
00176                 return *this;
00177             }
00178 
00187             explicit Config (const std::string &filename):
00188                 _c_config()
00189             {
00190                 Error e;
00191                 sal3d_merger_config_new_from_file (filename.c_str(),
00192                         &_c_config, &e.e);
00193                 if (e.e.value < 0)
00194                     throw e;
00195             }
00196 
00200             ~Config ()
00201             {
00202                 sal3d_merger_config_release (_c_config);
00203             }
00204 
00221             std::vector<float> accuracyMean() const
00222             {
00223                 std::vector<float> vec(2);
00224                 Error e;
00225                 sal3d_merger_config_get_accuracy_mean(_c_config,
00226                         &vec[0], &vec[1], &e.e);
00227                 if (e.e.value < 0)
00228                     throw e;
00229                 return vec;
00230             }
00231 
00248             std::vector<float> accuracyStdDev() const
00249             {
00250                 std::vector<float> vec(2);
00251                 Error e;
00252                 sal3d_merger_config_get_accuracy_stddev(_c_config,
00253                         &vec[0], &vec[1], &e.e);
00254                 if (e.e.value < 0)
00255                     throw e;
00256                 return vec;
00257             }
00258 
00270             sal3d_merger_config c_config() const
00271             {
00272                 return _c_config;
00273             }
00274 
00293             std::vector<float> patternMisorientation() const
00294             {
00295                 std::vector<float> vec(2);
00296                 Error e;
00297                 sal3d_merger_config_get_misorientation(_c_config,
00298                         &vec[0], &vec[1], &e.e);
00299                 if (e.e.value < 0)
00300                     throw e;
00301                 return vec;
00302             }
00303 
00311             void
00312             saveToFile (const std::string &fileName) const
00313             {
00314                 Error e;
00315                 sal3d_merger_config_save_to_file (_c_config,
00316                         fileName.c_str (), &e.e);
00317                 if (e.e.value < 0)
00318                     throw e;
00319             }
00320 
00321         private:
00323             sal3d_merger_config _c_config;
00324         };
00325 
00362         inline void
00363         average (const Profile &base, const Profile &aux,
00364                  Profile &result, const Merger::Config &config,
00365                  float tolerancy = std::numeric_limits<float>::max())
00366         {
00367             const sal3d_merger_config c_config = config.c_config();
00368             Error e;
00369             sal3d_merger_average (base.c_profile (),
00370                     aux.c_profile(), c_config, tolerancy, result.c_profile(),
00371                     &e.e);
00372             if (e.e.value < 0)
00373                 throw e;
00374         }
00375 
00401         inline Merger::Config
00402         calibrate (const RangeMap &base, const RangeMap &aux)
00403         {
00404             sal3d_merger_config config;
00405 
00406             Error e;
00407             sal3d_merger_calibrate (base.c_range_map (),
00408                 aux.c_range_map(), &config, &e.e);
00409 
00410             if (e.e.value < 0)
00411                 throw e;
00412 
00413             return Merger::Config(config);
00414         }
00415 
00458         inline Merger::Config
00459         calibrate (const RangeMap &base, const RangeMap &aux, int top,
00460                 int bottom, int leftBase, int rightBase, int leftAux,
00461                 int rightAux)
00462         {
00463             sal3d_merger_config config;
00464 
00465             Error e;
00466             sal3d_merger_calibrate_crop (base.c_range_map (),
00467                 aux.c_range_map(), top, bottom, leftBase, rightBase,
00468                 leftAux, rightAux, &config, &e.e);
00469 
00470             if (e.e.value < 0)
00471                 throw e;
00472 
00473             return Merger::Config(config);
00474         }
00475     }
00476 }
00477 
00478 #endif // !AQSENSE_SAL3DPP_MERGER_HPP