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