00001
00002
00003
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
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