PeakFinder.hpp
00001 //
00002 // Software Peak Finder for SAL3D.
00003 // Copyright 2010 AQSENSE, S.L.
00004 //
00005 #if !defined (AQSENSE_SAL3DPP_PEAK_FINDER_HPP)
00006 #define AQSENSE_SAL3DPP_PEAK_FINDER_HPP
00007 
00008 #if defined (_MSC_VER) && (_MSC_VER >= 1020)
00009 #pragma once
00010 #endif
00011 
00012 #include <sal3d/peakfinder.h>
00013 #include <cstddef>
00014 #include <stdexcept>
00015 #include <vector>
00016 #include "Frame.hpp"
00017 #include "Profile.hpp"
00018 
00019 namespace sal3d
00020 {
00077     class PeakFinder
00078     {
00079         public:
00091             explicit PeakFinder (float threshold)
00092             {
00093                 _finder.p = 0;
00094                 Error e;
00095                 sal3d_peak_finder_new (threshold, &_finder, &e.e); 
00096                 if (e.e.value < 0)
00097                     throw e;
00098             }
00099 
00107             PeakFinder (const PeakFinder &finder):
00108                 _finder (finder._finder)
00109             {
00110                 Error e;
00111                 sal3d_peak_finder_share (_finder, &e.e);
00112                 if (e.e.value < 0)
00113                     throw e;
00114             }
00115 
00122             ~PeakFinder ()
00123             {
00124                 sal3d_peak_finder_release (_finder);
00125             }
00126 
00134             float
00135             getThreshold () const
00136             {
00137                 float threshold;
00138                 Error e;
00139                 sal3d_peak_finder_get_threshold (_finder, &threshold, &e.e);
00140                 if (e.e.value < 0)
00141                     throw e;
00142                 return threshold;
00143             }
00144 
00161             void
00162             operator() (const sal3d::Frame &frame, sal3d::Profile &profile) const
00163             {
00164                 Error e;
00165                 sal3d_peak_finder_get_profile (_finder, frame.c_frame (),
00166                         profile.c_profile (), &e.e);
00167                 if (e.e.value < 0)
00168                     throw e;
00169             }
00170 
00180             PeakFinder &
00181             operator= (const PeakFinder &rhs)
00182             {
00183                 Error e;
00184                 sal3d_peak_finder_share (rhs._finder, &e.e);
00185                 if (e.e.value < 0)
00186                     throw e;
00187                 sal3d_peak_finder_release (_finder);
00188                 _finder = rhs._finder;
00189 
00190                 return *this;
00191             }
00192 
00200             void
00201             setThreshold (float threshold)
00202             {
00203                 Error e;
00204                 sal3d_peak_finder_set_threshold (_finder, threshold, &e.e);
00205                 if (e.e.value < 0)
00206                     throw e;
00207             }
00208 
00218             int
00219             profileLength (const sal3d::Frame &frame)
00220             {
00221                 return frame.height();
00222             }
00223 
00224         private:
00226             sal3d_peak_finder _finder;
00227     };
00228 }
00229 #endif // !AQSENSE_SAL3DPP_PEAK_FINDER_HPP