00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_SNAKES_SNAKES_BASE_HH
00029 # define OLENA_SNAKES_SNAKES_BASE_HH
00030
00031 #include <oln/snakes/segment.hh>
00032
00033 namespace oln {
00034
00037 namespace snakes {
00043 template <class algorithm>
00044 class snake
00045 {
00046 public:
00047 typedef typename algorithm::image_type image_type;
00048 typedef typename image_type::point_type point_type;
00049
00050 public:
00051 snake(const image_type& image,
00052 std::list<point_type> initial_contour,
00053 ntg::float_s alpha,
00054 ntg::float_s beta,
00055 ntg::float_s gamma,
00056 ntg::float_s khi);
00057
00058 public:
00059 std::list<point_type>
00060 contour(void) const;
00062
00063 ntg::float_s
00064 energy(void) const;
00067
00068 public:
00069 int
00070 update_snake(void);
00074
00075 void
00076 converge(void);
00079
00080 private:
00081 segment<image_type> s;
00086
00087 algorithm a;
00089
00090
00091 private:
00093 image_type gradient;
00094
00095 private:
00097 ntg::float_s alpha;
00098 ntg::float_s beta;
00099 ntg::float_s gamma;
00100 ntg::float_s khi;
00101
00102 private:
00103 friend
00104 int
00105 algorithm::update_snake(const typename algorithm::image_type&, snake&);
00106
00107 friend
00108 void
00109 algorithm::converge(const typename algorithm::image_type&, snake&);
00110
00111 friend
00112 std::ostream&
00113 ::operator<< <>(std::ostream&, const snake&);
00114 };
00115
00116 }
00117
00118 }
00119
00120 template <class algorithm>
00121 std::ostream& operator<<(std::ostream& os,
00122 const oln::snakes::snake<algorithm>& s)
00123 {
00124 os << "Snake:" << std::endl;
00125 os << s.s;
00126 return os;
00127 }
00128
00129 #include <oln/snakes/snakes_base.hxx>
00130
00131 #endif // !OLENA_SNAKES_SNAKES_BASE_HH